這篇文章主要為大家詳細介紹了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。 程式執行後
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)最後,我們設定視窗的主佈局。 程式執行後
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)到佈局中。 程式執行後
擴充網格佈局
視窗中的控制項可以跨越網格中的多個列或行。在下面的例子中,我們說明這一點。#!/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每天必學之佈局管理的詳細內容。更多資訊請關注PHP中文網其他相關文章!