PyQt5每天必學之佈局管理

不言
發布: 2018-04-19 13:50:04
原創
3815 人瀏覽過

這篇文章主要為大家詳細介紹了PyQt5每天必學之佈局管理的相關資料,具有一定的參考價值,感興趣的小伙伴們可以參考一下

在GUI編程中有一個不容忽視的部分,那就是佈局管理。佈局管理掌控著我們的控制項在應用程式視窗如何擺放。佈局管理可以透過兩種方式來完成。我們可以使用絕對定位或佈局類別兩種方法來控製程式視窗中的控制項位置。

絕對定位

每個控制項會依照程式設計師指定的位置放置。當您使用絕對定位,我們要了解以下限制:

  • 如果我們調整視窗的大小控制項的大小和位置保持不變

  • 在不同平台上應用程式看起來可能會不同

  • 更改字體可能會破壞應用程式的佈局

  • ##如果決定改變佈局,我們必須每個控制項徹底的加以修改,這是繁瑣且耗時的


#下面的範例就是控制項的絕對座標定位方式。

#!/usr/bin/python3
# -*- coding: utf-8 -*-

"""
PyQt5 教程

这个例子显示了在窗口中使用绝对定位的三个标签。

作者:我的世界你曾经来过
博客:http://blog.csdn.net/weiaitaowang
最后编辑:2016年7月31日
"""

import sys
from PyQt5.QtWidgets import QApplication, QWidget, QLabel

class Example(QWidget):

 def __init__(self):
  super().__init__()

  self.initUI()

 def initUI(self):

  lbl1 = QLabel('我的世界你曾经来过', self)
  lbl1.move(15, 10)

  lbl2 = QLabel('CSND博客', self)
  lbl2.move(35, 40)

  lbl3 = QLabel('程序员', self)
  lbl3.move(55, 70)

  self.setGeometry(300, 300, 250, 150)
  self.setWindowTitle('绝对定位')  
  self.show()

if __name__ == '__main__':

 app = QApplication(sys.argv)
 ex = Example()
 sys.exit(app.exec_())
登入後複製

在我們的範例中使用的都是標籤(Label)。我們透過提供x和y座標值來定位它們。座標系的原點是控件的左上角。 x值增長是從左到右。 y值增長是從上到下。

lbl1 = QLabel('我的世界你曾经来过', self)
lbl1.move(15, 10)
登入後複製

標籤控制項被放置在 x=15 和 y=10。

程式執行後


PyQt5每天必學之佈局管理

Box layout盒子佈局

佈局管理使用佈局類別的方式更加靈活、實用。它是將一個控制項放在視窗中的首選方式。 QHBoxLayout和QVBoxLayout分別是水平和垂直對齊控制項的基本版面配置類別。

試想一下,我們希望把兩個按鈕在程式的右下角。要建立這樣一個佈局,我們可以使用一橫一縱兩個框。要創造必要的空餘空間,我們將增加一個拉伸因子(stretch factor)。


#!/usr/bin/python3
# -*- coding: utf-8 -*-

"""
PyQt5 教程

在这个例子中,我们在窗口的右下角放置两个按钮。

作者:我的世界你曾经来过
博客:http://blog.csdn.net/weiaitaowang
最后编辑:2016年7月31日
"""

import sys
from PyQt5.QtWidgets import (QApplication, QWidget,
  QPushButton, QVBoxLayout, QHBoxLayout)

class Example(QWidget):

 def __init__(self):
  super().__init__()

  self.initUI()

 def initUI(self):

  okButton = QPushButton('确定')
  cancelButton = QPushButton('取消')

  hbox = QHBoxLayout()
  hbox.addStretch(1)
  hbox.addWidget(okButton)
  hbox.addWidget(cancelButton)

  vbox = QVBoxLayout()
  vbox.addStretch(1)
  vbox.addLayout(hbox)

  self.setLayout(vbox)

  self.setGeometry(300, 300, 350, 150)
  self.setWindowTitle('Box布局')  
  self.show()

if __name__ == '__main__':

 app = QApplication(sys.argv)
 ex = Example()
 sys.exit(app.exec_())
登入後複製

該範例將兩個按鈕放在視窗的右下角。當我們調整應用程式視窗的大小時,他們是固定在右下角的。我們同時使用HBoxLayout 和QVBoxLayout佈局。

okButton = QPushButton('确定')
 cancelButton = QPushButton('取消')
登入後複製

這裡我們建立了兩個按鈕。

hbox = QHBoxLayout()
hbox.addStretch(1)
hbox.addWidget(okButton)
hbox.addWidget(cancelButton)
登入後複製

我們建立了一個水平box佈局,增加拉伸因子(addStretch),加入(addWidget)兩個按鈕。在新增兩個按鈕之前增加了一個拉伸因子,這會將兩個按鈕推到視窗右側。

vbox = QVBoxLayout()
vbox.addStretch(1)
vbox.addLayout(hbox)
登入後複製

要得到我們想要的佈局,還需將橫向佈局放入垂直的佈局中。在垂直框上的拉伸因子會將水平框包含裡面的控制項推至視窗的底部。

self.setLayout(vbox)
登入後複製

最後,我們設定視窗的主佈局。

程式執行後

PyQt5每天必學之佈局管理

QGridLayout網格佈局

最常用的佈局類別是網格佈局。這種佈局將該空間分成行和列。要建立一個網格佈局,我們使用QGridLayout 的類別。

#!/usr/bin/python3
# -*- coding: utf-8 -*-

"""
PyQt5 教程

在这个例子中,我们使用网格布局创建一个计算器的框架。

作者:我的世界你曾经来过
博客:http://blog.csdn.net/weiaitaowang
最后编辑:2016年7月31日
"""

import sys
from PyQt5.QtWidgets import (QApplication, QWidget,
QPushButton, QGridLayout)

class Example(QWidget):

 def __init__(self):
  super().__init__()

  self.initUI()

 def initUI(self):

  grid = QGridLayout()  
  self.setLayout(grid)

  names = ['Cls', 'Bck', '', 'Close', 
  '7', '8', '9', '/',
  '4', '5', '6', '*',
  '1', '2', '3', '-',
  '0', '.', '=', '+',]

  positions = [(i, j) for i in range(5) for j in range(4)]

  for position, name in zip(positions, names):

   if name == '':
    continue
   button = QPushButton(name)
   grid.addWidget(button, *position)

  self.move(300, 150)
  self.setWindowTitle('计算器')  
  self.show()

if __name__ == '__main__':

 app = QApplication(sys.argv)
 ex = Example()
 sys.exit(app.exec_())
登入後複製

在我們的範例中,我們將建立的按鈕控制項放在網格中。

grid = QGridLayout()  
self.setLayout(grid)
登入後複製

實例化 QGridLayout 並設定應用程式視窗的佈局。

 names = ['Cls', 'Bck', '', 'Close', 
  '7', '8', '9', '/',
  '4', '5', '6', '*',
  '1', '2', '3', '-',
  '0', '.', '=', '+',]
登入後複製

這是以後要用到的按鈕標籤。

positions = [(i, j) for i in range(5) for j in range(4)]
登入後複製

x我們建立了網格位置的清單。

for position, name in zip(positions, names):

   if name == '':
    continue
   button = QPushButton(name)
   grid.addWidget(button, *position)
登入後複製

建立按鈕並新增(addWidget)到佈局中。

程式執行後

PyQt5每天必學之佈局管理

擴充網格佈局

視窗中的控制項可以跨越網格中的多個列或行。在下面的例子中,我們說明這一點。


#!/usr/bin/python3
# -*- coding: utf-8 -*-

"""
PyQt5 教程

在这个例子中,我们使用GridLayout的跨行创建了一个更复杂的窗口布局。

作者:我的世界你曾经来过
博客:http://blog.csdn.net/weiaitaowang
最后编辑:2016年7月31日
"""

import sys
from PyQt5.QtWidgets import (QApplication, QWidget, QLabel, 
QTextEdit, QLineEdit, QGridLayout)

class Example(QWidget):

 def __init__(self):
  super().__init__()

  self.initUI()

 def initUI(self):

  title = QLabel('标题')
  author = QLabel('作者')
  review = QLabel('评论')

  titleEdit = QLineEdit()
  authorEdit = QLineEdit()
  reviewEdit = QTextEdit()

  grid =QGridLayout()
  grid.setSpacing(10)

  grid.addWidget(title, 1, 0)
  grid.addWidget(titleEdit, 1, 1)

  grid.addWidget(author, 2, 0)
  grid.addWidget(authorEdit, 2, 1)

  grid.addWidget(review, 3, 0)
  grid.addWidget(reviewEdit, 3, 1, 5, 1)

  self.setLayout(grid)

  self.setGeometry(300, 300, 350, 300)
  self.setWindowTitle('评论')  
  self.show()

if __name__ == '__main__':

 app = QApplication(sys.argv)
 ex = Example()
 sys.exit(app.exec_())
登入後複製

我們建立的程式中包含三個標籤,兩個單行文字輸入框和一個文字編輯控件,使用QGridLayout佈局。

grid =QGridLayout()
grid.setSpacing(10)
登入後複製

實例化網格佈局和並設定設定間距。

grid.addWidget(reviewEdit, 3, 1, 5, 1)
登入後複製

新增一個控制項到網格佈局中,我們可以為這個控制項使用行跨度或列跨度。在我們的例子中,我們要求reviewEdit控制項跨度5行。

程式執行後


PyQt5每天必學之佈局管理

在PyQt5教程的這一部分專門介紹了佈局管理。後面將會介紹PyQt5的事件相關內容。

相關推薦:

PyQt5每天必學之帶有標籤的複選框

PyQt5每天必學之創建視窗居中效果

PyQt5每天必學關閉視窗

#

以上是PyQt5每天必學之佈局管理的詳細內容。更多資訊請關注PHP中文網其他相關文章!

相關標籤:
來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板
關於我們 免責聲明 Sitemap
PHP中文網:公益線上PHP培訓,幫助PHP學習者快速成長!