PyQt5每天必學(xué)之布局管理
在GUI編程中有一個(gè)不容忽視的部分,那就是布局管理。布局管理掌控著我們的控件在應(yīng)用程序窗口如何擺放。布局管理可以通過兩種方式來完成。我們可以使用絕對(duì)定位或布局類兩種方法控制程序窗口中的控件位置。
絕對(duì)定位
每個(gè)控件按程序員指定的位置放置。當(dāng)您使用絕對(duì)定位,我們要了解以下限制:
- 如果我們調(diào)整窗口的大小控件的大小和位置保持不變
- 在不同平臺(tái)上應(yīng)用程序看起來可能會(huì)不同
- 更改字體可能會(huì)破壞應(yīng)用程序的布局
- 如果決定改變布局,我們必須每個(gè)控件徹底的加以修改,這是繁瑣和耗時(shí)的
下面的例子就是控件的絕對(duì)坐標(biāo)定位方式。
#!/usr/bin/python3 # -*- coding: utf-8 -*- """ PyQt5 教程 這個(gè)例子顯示了在窗口中使用絕對(duì)定位的三個(gè)標(biāo)簽。 作者:我的世界你曾經(jīng)來過 博客: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('我的世界你曾經(jīng)來過', 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('絕對(duì)定位') self.show() if __name__ == '__main__': app = QApplication(sys.argv) ex = Example() sys.exit(app.exec_())
在我們的例子中使用的都是標(biāo)簽(Label)。我們通過提供x和y坐標(biāo)值定位它們。坐標(biāo)系的原點(diǎn)是控件的左上角。 x值增長是由左到右。 y值增長是從上到下。
lbl1 = QLabel('我的世界你曾經(jīng)來過', self) lbl1.move(15, 10)
標(biāo)簽控件被放置在 x=15 和 y=10。
程序執(zhí)行后
Box layout盒子布局
布局管理使用布局類的方式更加靈活、實(shí)用。它是將一個(gè)控件放在窗口中的首選方式。QHBoxLayout和QVBoxLayout分別是水平和垂直對(duì)齊控件的基本布局類。
試想一下,我們希望把兩個(gè)按鈕在程序的右下角。要?jiǎng)?chuàng)建這樣一個(gè)布局,我們可以使用一橫一縱兩個(gè)框。要?jiǎng)?chuàng)造必要的空余空間,我們將增加一個(gè)拉伸因子(stretch factor)。
#!/usr/bin/python3 # -*- coding: utf-8 -*- """ PyQt5 教程 在這個(gè)例子中,我們?cè)诖翱诘挠蚁陆欠胖脙蓚€(gè)按鈕。 作者:我的世界你曾經(jīng)來過 博客: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_())
該示例將兩個(gè)按鈕放在窗口的右下角。當(dāng)我們調(diào)整應(yīng)用程序窗口的大小時(shí),他們是固定在右下角的。我們同時(shí)使用HBoxLayout 和QVBoxLayout布局。
okButton = QPushButton('確定') cancelButton = QPushButton('取消')
這里我們創(chuàng)建了兩個(gè)按鈕。
hbox = QHBoxLayout() hbox.addStretch(1) hbox.addWidget(okButton) hbox.addWidget(cancelButton)
我們創(chuàng)建了一個(gè)水平box布局,增加拉伸因子(addStretch),添加(addWidget)兩個(gè)按鈕。在添加兩個(gè)按鈕之前增加了一個(gè)拉伸因子,這會(huì)將兩個(gè)按鈕推到窗口右側(cè)。
vbox = QVBoxLayout() vbox.addStretch(1) vbox.addLayout(hbox)
要得到我們想要的布局,還需將橫向布局放入垂直的布局中。在垂直框上的拉伸因子會(huì)將水平框包括里面的控件推至窗口的底部。
self.setLayout(vbox)
最后,我們?cè)O(shè)置窗口的主布局。
程序執(zhí)行后
QGridLayout網(wǎng)格布局
最經(jīng)常使用的布局類是網(wǎng)格布局。這種布局將該空間分成行和列。要?jiǎng)?chuàng)建一個(gè)網(wǎng)格布局,我們使用QGridLayout 的類。
#!/usr/bin/python3 # -*- coding: utf-8 -*- """ PyQt5 教程 在這個(gè)例子中,我們使用網(wǎng)格布局創(chuàng)建一個(gè)計(jì)算器的框架。 作者:我的世界你曾經(jīng)來過 博客: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('計(jì)算器') self.show() if __name__ == '__main__': app = QApplication(sys.argv) ex = Example() sys.exit(app.exec_())
在我們的例子中,我們將創(chuàng)建的按鈕控件放在網(wǎng)格中。
grid = QGridLayout() self.setLayout(grid)
實(shí)例化 QGridLayout 并設(shè)置應(yīng)用程序窗口的布局。
names = ['Cls', 'Bck', '', 'Close', '7', '8', '9', '/', '4', '5', '6', '*', '1', '2', '3', '-', '0', '.', '=', '+',]
這是以后要用到的按鈕標(biāo)簽。
positions = [(i, j) for i in range(5) for j in range(4)]
x我們創(chuàng)建了網(wǎng)格位置的列表。
for position, name in zip(positions, names): if name == '': continue button = QPushButton(name) grid.addWidget(button, *position)
創(chuàng)建按鈕并添加(addWidget)到布局中。
程序執(zhí)行后
擴(kuò)展網(wǎng)格布局
窗口中的控件可以跨越網(wǎng)格中的多個(gè)列或行。在下面的例子中,我們說明這一點(diǎn)。
#!/usr/bin/python3 # -*- coding: utf-8 -*- """ PyQt5 教程 在這個(gè)例子中,我們使用GridLayout的跨行創(chuàng)建了一個(gè)更復(fù)雜的窗口布局。 作者:我的世界你曾經(jīng)來過 博客: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('標(biāo)題') author = QLabel('作者') review = QLabel('評(píng)論') 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('評(píng)論') self.show() if __name__ == '__main__': app = QApplication(sys.argv) ex = Example() sys.exit(app.exec_())
我們創(chuàng)建的程序中包含三個(gè)標(biāo)簽,兩個(gè)單行文本輸入框和一個(gè)文本編輯控件,使用QGridLayout布局。
grid =QGridLayout() grid.setSpacing(10)
實(shí)例化網(wǎng)格布局和并設(shè)置設(shè)置間距。
grid.addWidget(reviewEdit, 3, 1, 5, 1)
添加一個(gè)控件到網(wǎng)格布局中,我們可以為這個(gè)控件使用行跨度或列跨度。在我們的例子中,我們要求reviewEdit控件跨度5行。
程序執(zhí)行后
在PyQt5教程的這一部分專門介紹了布局管理。后面將會(huì)介紹PyQt5的事件相關(guān)內(nèi)容。
以上就是本文的全部內(nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
python上selenium的彈框操作實(shí)現(xiàn)
這篇文章主要介紹了python上selenium的彈框操作實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-07-07python項(xiàng)目運(yùn)行導(dǎo)致內(nèi)存越來越大的原因詳析
最近在跑python程序時(shí),出現(xiàn)占用的內(nèi)存不斷增加的情況,下面這篇文章主要給大家介紹了關(guān)于python項(xiàng)目運(yùn)行導(dǎo)致內(nèi)存越來越大的原因詳析,本文通過圖文介紹的非常詳細(xì),需要的朋友可以參考下2022-11-11pymongo為mongodb數(shù)據(jù)庫添加索引的方法
這篇文章主要介紹了pymongo為mongodb數(shù)據(jù)庫添加索引的方法,涉及Python操作mongodb數(shù)據(jù)庫的相關(guān)技巧,非常簡單實(shí)用,需要的朋友可以參考下2015-05-05在Mac OS系統(tǒng)上安裝Python的Pillow庫的教程
這篇文章主要介紹了在MacOS下安裝Python的Pillow庫的教程,Pillow庫用來對(duì)圖片進(jìn)行各種處理操作,需要的朋友可以參考下2015-11-11python中讀取txt文件時(shí)split()函數(shù)的妙用
這篇文章主要介紹了python中讀取txt文件時(shí)split()函數(shù)的妙用,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-11-11