打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
PyQt5快速入门(五)PyQt5布局管理

一、GUI布局管理简介

PyQt5中进行界面布局管理的方法主要由两种,一种是绝对定位,一种是使用布局管理器。Qt中使用绝对定位的布局方式无法自适应窗口的变化,因此Qt中提供了对界面组件进行布局管理的类,用于对界面组件进行管理,能够自动排列窗口中的界面组件,窗口大小变化后自动更新界面组件的大小。


QLayout是Qt中布局管理器的抽象基类,通过对QLayout的继承,实现了功能各异且互补的布局管理器。布局管理器不是界面组件,而是界面组件的定位策略;任意容器类型的组件都可以指定布局管理器;同一个布局管理器管理中的组件拥有相同的父组件,在设置布局管理器的同时已经隐式指定了父子关系。
Qt布局管理器的addWidget用于向布局管理器中插入控件,addLayout用于向布局管理器插入子布局管理器。

二、框布局

1、QHBoxLayout

QHBoxLayout提供了水平方式对控件进行布局管理。

import sysfrom PyQt5.QtWidgets import QApplication, QWidget, QHBoxLayout, QPushButton, QSizePolicyclass 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_())

2、QVBoxLayout

QVBoxLayout提供了垂直方式对控件进行布局管理。

import sysfrom PyQt5.QtWidgets import QApplication, QWidget, QVBoxLayout, QPushButton, QSizePolicyclass 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_())

3、嵌套布局

布局管理器可以相互嵌套,形成复杂的布局管理方式。QBoxLayout布局管理器的嵌套使用实例如下:

import sysfrom PyQt5.QtWidgets import QApplication, QWidget, QVBoxLayout, QHBoxLayout, QPushButton, QSizePolicyclass 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 sysfrom PyQt5.QtWidgets import QApplication, QWidget, QGridLayout, QPushButton, QSizePolicyclass 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 sysfrom PyQt5.QtWidgets import QApplication, QWidget, QFormLayout, QVBoxLayout, QLineEditfrom PyQt5.QtCore import Qtclass 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 sysfrom PyQt5.QtWidgets import QApplication, QWidget, QStackedLayout, QVBoxLayout, QPushButtonclass 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 sysfrom PyQt5.QtWidgets import QApplication, QWidget, QStackedLayout, QVBoxLayout, QPushButtonclass 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 sysfrom PyQt5.QtWidgets import QApplication, QWidget, QTextEdit, QVBoxLayout, QSplitterfrom PyQt5.QtCore import Qtclass 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_())

本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
qt 布局管理和空间管理 Layouts & Spacers
PyQt5基础知识 超详细!!!(含代码)
Python和PyQt:构建GUI桌面计算器
Python GUI教程(十六):在PyQt5中美化和装扮图形界面 | 码农网
实战PyQt5: 113-QSS 定制窗口的标题栏
【转】pyqt界面刷新(表格数据刷新)、界面传值
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服