這篇文章主要介紹PyQt5布局管理的示例分析,文中介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們一定要看完!
創(chuàng)新互聯(lián)公司專注于中大型企業(yè)的成都網(wǎng)站建設(shè)、成都做網(wǎng)站和網(wǎng)站改版、網(wǎng)站營(yíng)銷服務(wù),追求商業(yè)策劃與數(shù)據(jù)分析、創(chuàng)意藝術(shù)與技術(shù)開發(fā)的融合,累計(jì)客戶1000多家,服務(wù)滿意度達(dá)97%。幫助廣大客戶順利對(duì)接上互聯(lián)網(wǎng)浪潮,準(zhǔn)確優(yōu)選出符合自己需要的互聯(lián)網(wǎng)運(yùn)用,我們將一直專注品牌網(wǎng)站設(shè)計(jì)和互聯(lián)網(wǎng)程序開發(fā),在前進(jìn)的路上,與客戶一起成長(zhǎng)!PyQt5中進(jìn)行界面布局管理的方法主要由兩種,一種是絕對(duì)定位,一種是使用布局管理器。Qt中使用絕對(duì)定位的布局方式無法自適應(yīng)窗口的變化,因此Qt中提供了對(duì)界面組件進(jìn)行布局管理的類,用于對(duì)界面組件進(jìn)行管理,能夠自動(dòng)排列窗口中的界面組件,窗口大小變化后自動(dòng)更新界面組件的大小。
QLayout是Qt中布局管理器的抽象基類,通過對(duì)QLayout的繼承,實(shí)現(xiàn)了功能各異且互補(bǔ)的布局管理器。布局管理器不是界面組件,而是界面組件的定位策略;任意容器類型的組件都可以指定布局管理器;同一個(gè)布局管理器管理中的組件擁有相同的父組件,在設(shè)置布局管理器的同時(shí)已經(jīng)隱式指定了父子關(guān)系。
Qt布局管理器的addWidget用于向布局管理器中插入控件,addLayout用于向布局管理器插入子布局管理器。
QHBoxLayout提供了水平方式對(duì)控件進(jìn)行布局管理。
import sys from PyQt5.QtWidgets import QApplication, QWidget, QHBoxLayout, QPushButton, QSizePolicy class MainWindow(QWidget): def __init__(self, parent=None): super().__init__(parent) self.layout = QHBoxLayout() self.layout.setSpacing(20) button = QPushButton("Button1") button.setMinimumSize(60, 30) button.setSizePolicy(QSizePolicy.Expanding, QSizePolicy.Expanding) self.layout.addWidget(button) button = QPushButton("Button2") button.setMinimumSize(60, 30) button.setSizePolicy(QSizePolicy.Expanding, QSizePolicy.Expanding) self.layout.addWidget(button) self.setLayout(self.layout) if __name__ == "__main__": app = QApplication(sys.argv) window = MainWindow() window.resize(400, 200) window.show() sys.exit(app.exec_())
QVBoxLayout提供了垂直方式對(duì)控件進(jìn)行布局管理。
import sys from PyQt5.QtWidgets import QApplication, QWidget, QVBoxLayout, QPushButton, QSizePolicy class MainWindow(QWidget): def __init__(self, parent=None): super().__init__(parent) self.layout = QVBoxLayout() self.layout.setSpacing(20) button = QPushButton("Button1") button.setMinimumSize(60, 30) button.setSizePolicy(QSizePolicy.Expanding, QSizePolicy.Expanding) self.layout.addWidget(button) button = QPushButton("Button2") button.setMinimumSize(60, 30) button.setSizePolicy(QSizePolicy.Expanding, QSizePolicy.Expanding) self.layout.addWidget(button) self.setLayout(self.layout) if __name__ == "__main__": app = QApplication(sys.argv) window = MainWindow() window.resize(400, 200) window.show() sys.exit(app.exec_())
布局管理器可以相互嵌套,形成復(fù)雜的布局管理方式。QBoxLayout布局管理器的嵌套使用實(shí)例如下:
import sys from PyQt5.QtWidgets import QApplication, QWidget, QVBoxLayout, QHBoxLayout, QPushButton, QSizePolicy class MainWindow(QWidget): def __init__(self, parent=None): super().__init__(parent) self.layout = QVBoxLayout() self.layout.setSpacing(20) # 第一行按鈕布局管理 hLayout1 = QHBoxLayout() button = QPushButton("Button1") button.setMinimumSize(60, 30) button.setSizePolicy(QSizePolicy.Expanding, QSizePolicy.Expanding) hLayout1.addWidget(button) button = QPushButton("Button2") button.setMinimumSize(60, 30) button.setSizePolicy(QSizePolicy.Expanding, QSizePolicy.Expanding) hLayout1.addWidget(button) # 第二行按鈕布局管理 hLayout2 = QHBoxLayout() button = QPushButton("Button1") button.setMinimumSize(60, 30) button.setSizePolicy(QSizePolicy.Expanding, QSizePolicy.Expanding) hLayout2.addWidget(button) button = QPushButton("Button2") button.setMinimumSize(60, 30) button.setSizePolicy(QSizePolicy.Expanding, QSizePolicy.Expanding) hLayout2.addWidget(button) # 整體垂直布局管理 self.layout.addLayout(hLayout1) self.layout.addLayout(hLayout2) self.setLayout(self.layout) if __name__ == "__main__": app = QApplication(sys.argv) window = MainWindow() window.resize(400, 200) window.show() sys.exit(app.exec_())
QGridLayout布局管理器以網(wǎng)格的方式管理界面組件。
import sys from PyQt5.QtWidgets import QApplication, QWidget, QGridLayout, QPushButton, QSizePolicy class MainWindow(QWidget): def __init__(self, parent=None): super().__init__(parent) self.layout = QGridLayout() self.layout.setSpacing(5) button = QPushButton("Button1") button.setMinimumSize(60, 30) button.setSizePolicy(QSizePolicy.Expanding,QSizePolicy.Expanding) self.layout.addWidget(button, 0, 0, 1, 1) button = QPushButton("Button2") button.setMinimumSize(60, 30) button.setSizePolicy(QSizePolicy.Expanding,QSizePolicy.Expanding) self.layout.addWidget(button, 0, 1, 1, 1) button = QPushButton("Button3") button.setMinimumSize(60, 30) button.setSizePolicy(QSizePolicy.Expanding,QSizePolicy.Expanding) self.layout.addWidget(button, 1, 0, 1, 1) button = QPushButton("Button4") button.setMinimumSize(60, 30) button.setSizePolicy(QSizePolicy.Expanding,QSizePolicy.Expanding) self.layout.addWidget(button, 1, 1, 1, 1) button = QPushButton("Button5") button.setMinimumSize(60, 30) button.setSizePolicy(QSizePolicy.Expanding, QSizePolicy.Expanding) # 列擴(kuò)展,定位在第2行第1列位置,占1行2列 self.layout.addWidget(button, 2, 0, 1, 2) self.setLayout(self.layout) if __name__ == "__main__": app = QApplication(sys.argv) window = MainWindow() window.resize(400, 200) window.show() sys.exit(app.exec_())
QFormLayout布局管理器使用表單的方式管理界面組件,表單中的標(biāo)簽和組件是相互對(duì)應(yīng)的關(guān)系,支持嵌套使用。
import sys from PyQt5.QtWidgets import QApplication, QWidget, QFormLayout, QVBoxLayout, QLineEdit from PyQt5.QtCore import Qt class MainWindow(QWidget): def __init__(self, parent=None): super().__init__(parent) self.layout = QFormLayout() self.layout.setSpacing(20) self.layout.setLabelAlignment(Qt.AlignLeft) self.layout.setFormAlignment(Qt.AlignRight) nameEdit = QLineEdit() mailEdit = QLineEdit() vLayout = QVBoxLayout() vLayout.setSpacing(6) addrEdit1 = QLineEdit() addrEdit2 = QLineEdit() vLayout.addWidget(addrEdit1) vLayout.addWidget(addrEdit2) self.layout.addRow("Name:", nameEdit) self.layout.addRow("Mail:", mailEdit) self.layout.addRow("Address:", vLayout) self.setLayout(self.layout) self.setWindowTitle("FTP") if __name__ == "__main__": app = QApplication(sys.argv) window = MainWindow() window.resize(400, 200) window.show() sys.exit(app.exec_())
QStackedLayout棧式布局管理器管理的所有組件在垂直于屏幕的方向上,每次只有一個(gè)界面組件會(huì)顯示在屏幕上,只要最頂層的界面組件會(huì)被顯示。
QStackedLayout棧式布局管理器的特點(diǎn)如下:
A、組件大小一致,且充滿父組件的顯示區(qū)
B、不能直接嵌套其它布局管理器
C、能夠自由切換需要顯示的組件
D、每次僅能顯示一個(gè)界面組件
import sys from PyQt5.QtWidgets import QApplication, QWidget, QStackedLayout, QVBoxLayout, QPushButton class MainWindow(QWidget): def __init__(self, parent=None): super().__init__(parent) self.layout = QStackedLayout() self.layout.addWidget(QPushButton("Button1")) self.layout.addWidget(QPushButton("Button2")) self.layout.addWidget(QPushButton("Button3")) self.layout.addWidget(QPushButton("Button4")) self.setLayout(self.layout) self.setWindowTitle("Stack Layout") # 設(shè)置棧頂顯示第2個(gè)組件 self.layout.setCurrentIndex(2) if __name__ == "__main__": app = QApplication(sys.argv) window = MainWindow() window.resize(400, 200) window.show() sys.exit(app.exec_())
QStackedLayout棧式布局管理器不能直接嵌套其它布局管理器,但可以通過QWidget容器組件間接嵌套使用其它布局管理器。
import sys from PyQt5.QtWidgets import QApplication, QWidget, QStackedLayout, QVBoxLayout, QPushButton class MainWindow(QWidget): def __init__(self, parent=None): super().__init__(parent) self.layout = QStackedLayout() self.layout.addWidget(QPushButton("Button1")) # 容器型組件 widget = QWidget() vLayout = QVBoxLayout() vLayout.addWidget(QPushButton("Button2")) vLayout.addWidget(QPushButton("Button3")) widget.setLayout(vLayout) self.layout.addWidget(widget) self.layout.addWidget(QPushButton("Button4")) self.setLayout(self.layout) self.setWindowTitle("Stack Layout") # 設(shè)置棧頂顯示第1個(gè)組件 self.layout.setCurrentIndex(1) if __name__ == "__main__": app = QApplication(sys.argv) window = MainWindow() window.resize(400, 200) window.show() sys.exit(app.exec_())
QSplitter是一個(gè)帶切分條(splitter handle)的布局管理器,可以通過setHandleWidth()函數(shù)來設(shè)置切分條的寬帶。QSplitter可以通過setOrientation()函數(shù)來指定分割方向,子組件按加載順序進(jìn)行指定方向排列。
import sys from PyQt5.QtWidgets import QApplication, QWidget, QTextEdit, QVBoxLayout, QSplitter from PyQt5.QtCore import Qt class MainWindow(QWidget): def __init__(self, parent=None): super().__init__(parent) self.layout = QVBoxLayout() self.mainSplitter = QSplitter(self) self.layout.addWidget(self.mainSplitter) self.setLayout(self.layout) # 水平線分割 self.mainSplitter.setOrientation(Qt.Horizontal) rightSplitter = QSplitter(self) # 垂直線分割 rightSplitter.setOrientation(Qt.Vertical) textEdit = QTextEdit() textEdit.setText("Window2") rightSplitter.addWidget(textEdit) textEdit = QTextEdit() textEdit.setText("Window3") rightSplitter.addWidget(textEdit) textEdit = QTextEdit() textEdit.setText("Window1") self.mainSplitter.addWidget(textEdit) self.mainSplitter.addWidget(rightSplitter) # 分割比例 self.mainSplitter.setStretchFactor(0, 1) self.mainSplitter.setStretchFactor(1, 2) self.mainSplitter.show() self.setWindowTitle("Splitter") if __name__ == "__main__": app = QApplication(sys.argv) window = MainWindow() window.resize(400, 200) window.show() sys.exit(app.exec_())
以上是“PyQt5布局管理的示例分析”這篇文章的所有內(nèi)容,感謝各位的閱讀!希望分享的內(nèi)容對(duì)大家有幫助,更多相關(guān)知識(shí),歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道!
另外有需要云服務(wù)器可以了解下創(chuàng)新互聯(lián)cdcxhl.cn,海內(nèi)外云服務(wù)器15元起步,三天無理由+7*72小時(shí)售后在線,公司持有idc許可證,提供“云服務(wù)器、裸金屬服務(wù)器、高防服務(wù)器、香港服務(wù)器、美國(guó)服務(wù)器、虛擬主機(jī)、免備案服務(wù)器”等云主機(jī)租用服務(wù)以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡(jiǎn)單易用、服務(wù)可用性高、性價(jià)比高”等特點(diǎn)與優(yōu)勢(shì),專為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應(yīng)用場(chǎng)景需求。