您好,登錄后才能下訂單哦!
這篇文章主要介紹PyQt5布局管理的示例分析,文中介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們一定要看完!
PyQt5中進行界面布局管理的方法主要由兩種,一種是絕對定位,一種是使用布局管理器。Qt中使用絕對定位的布局方式無法自適應窗口的變化,因此Qt中提供了對界面組件進行布局管理的類,用于對界面組件進行管理,能夠自動排列窗口中的界面組件,窗口大小變化后自動更新界面組件的大小。
QLayout是Qt中布局管理器的抽象基類,通過對QLayout的繼承,實現了功能各異且互補的布局管理器。布局管理器不是界面組件,而是界面組件的定位策略;任意容器類型的組件都可以指定布局管理器;同一個布局管理器管理中的組件擁有相同的父組件,在設置布局管理器的同時已經隱式指定了父子關系。
Qt布局管理器的addWidget用于向布局管理器中插入控件,addLayout用于向布局管理器插入子布局管理器。
QHBoxLayout提供了水平方式對控件進行布局管理。
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提供了垂直方式對控件進行布局管理。
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_())
布局管理器可以相互嵌套,形成復雜的布局管理方式。QBoxLayout布局管理器的嵌套使用實例如下:
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布局管理器以網格的方式管理界面組件。
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) # 列擴展,定位在第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布局管理器使用表單的方式管理界面組件,表單中的標簽和組件是相互對應的關系,支持嵌套使用。
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棧式布局管理器管理的所有組件在垂直于屏幕的方向上,每次只有一個界面組件會顯示在屏幕上,只要最頂層的界面組件會被顯示。
QStackedLayout棧式布局管理器的特點如下:
A、組件大小一致,且充滿父組件的顯示區
B、不能直接嵌套其它布局管理器
C、能夠自由切換需要顯示的組件
D、每次僅能顯示一個界面組件
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") # 設置棧頂顯示第2個組件 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") # 設置棧頂顯示第1個組件 self.layout.setCurrentIndex(1) if __name__ == "__main__": app = QApplication(sys.argv) window = MainWindow() window.resize(400, 200) window.show() sys.exit(app.exec_())
QSplitter是一個帶切分條(splitter handle)的布局管理器,可以通過setHandleWidth()函數來設置切分條的寬帶。QSplitter可以通過setOrientation()函數來指定分割方向,子組件按加載順序進行指定方向排列。
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布局管理的示例分析”這篇文章的所有內容,感謝各位的閱讀!希望分享的內容對大家有幫助,更多相關知識,歡迎關注億速云行業資訊頻道!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。