您好,登錄后才能下訂單哦!
這篇文章給大家分享的是有關PyQt5中布局管理的示例分析的內容。小編覺得挺實用的,因此分享給大家做個參考,一起跟隨小編過來看看吧。
在GUI編程中有一個不容忽視的部分,那就是布局管理。布局管理掌控著我們的控件在應用程序窗口如何擺放。布局管理可以通過兩種方式來完成。我們可以使用絕對定位或布局類兩種方法控制程序窗口中的控件位置。
絕對定位
每個控件按程序員指定的位置放置。當您使用絕對定位,我們要了解以下限制:
如果我們調整窗口的大小控件的大小和位置保持不變
在不同平臺上應用程序看起來可能會不同
更改字體可能會破壞應用程序的布局
如果決定改變布局,我們必須每個控件徹底的加以修改,這是繁瑣和耗時的
下面的例子就是控件的絕對坐標定位方式。
#!/usr/bin/python3 # -*- coding: utf-8 -*- 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中布局管理的示例分析”這篇文章就分享到這里了,希望以上內容可以對大家有一定的幫助,讓大家可以學到更多知識,如果覺得文章不錯,可以把它分享出去讓更多的人看到吧!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。