博客
关于我
PyQt5教程7:布局Layout管理
阅读量:799 次
发布时间:2023-03-05

本文共 3763 字,大约阅读时间需要 12 分钟。

PyQt5 窗口布局

布局管理是我们如何将小部件放置在应用程序窗口上的方式。在PyQt5中,布局管理是组织小部件的首选方式。绝对定位虽然常用,但存在诸多限制。相比之下,使用布局类(如QHBoxLayout和QGridLayout)更为灵活且高效。

一、绝对定位

绝对定位是以像素为单位指定小部件的位置和大小。其优点是直观,但存在以下限制:

  • 灵活性差:调整窗口大小时,小部件位置和大小不会改变。
  • 平台差异:应用程序在不同平台上可能呈现不同外观。
  • 字体变化:改变字体可能破坏布局。
  • 维护成本高:更改布局需要重新编写整个布局,操作繁琐。
示例:绝对定位小部件

以下是使用绝对定位创建三个标签的示例代码:

import sysfrom PyQt5.QtWidgets import QWidget, QLabel, QApplicationclass Example(QWidget):    def __init__(self):        super().__init__()        self.initUI()        def initUI(self):        self.setGeometry(300, 300, 250, 150)        self.setWindowTitle('Absolute')        lbl1 = QLabel('ZetCode', self)        lbl1.move(15, 10)        lbl2 = QLabel('tutorials', self)        lbl2.move(35, 40)        lbl3 = QLabel('for programmers', self)        lbl3.move(55, 70)        self.show()def main():    app = QApplication(sys.argv)    ex = Example()    sys.exit(app.exec_())if __name__ == '__main__':    main()

二、QHBoxLayout 布局

QHBoxLayout用于水平排列小部件,常用于将多个控件放置在窗口的底部或顶部。以下示例展示了如何在窗口的右下角放置两个按钮:

import sysfrom PyQt5.QtWidgets import (QWidget, QPushButton, QHBoxLayout, QVBoxLayout, QApplication)class Example(QWidget):    def __init__(self):        super().__init__()        self.initUI()        def initUI(self):        okButton = QPushButton("OK")        cancelButton = QPushButton("Cancel")        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, 300, 150)        self.setWindowTitle('Buttons')        self.show()def main():    app = QApplication(sys.argv)    ex = Example()    sys.exit(app.exec_())if __name__ == '__main__':    main()

三、QGridLayout 布局

QGridLayout 是最通用的布局类,可将空间划分为行和列。以下是创建一个计算器框架的示例:

import sysfrom PyQt5.QtWidgets import (QWidget, QGridLayout, QPushButton, QApplication)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('Calculator')        self.show()def main():    app = QApplication(sys.argv)    ex = Example()    sys.exit(app.exec_())if __name__ == '__main__':    main()

四、代码案例

在某些情况下,小部件可能跨越多列或多行。以下示例展示了如何在网格布局中创建更复杂的窗口布局:

import sysfrom PyQt5.QtWidgets import (QWidget, QLabel, QLineEdit, QTextEdit, QGridLayout, QApplication)class Example(QWidget):    def __init__(self):        super().__init__()        self.initUI()        def initUI(self):        title = QLabel('Title')        author = QLabel('Author')        review = QLabel('Review')        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('Review')        self.show()def main():    app = QApplication(sys.argv)    ex = Example()    sys.exit(app.exec_())if __name__ == '__main__':    main()

以上示例展示了如何使用PyQt5的不同布局方式来创建灵活的窗口布局。通过合理选择布局类和使用小部件的位置和大小,可以为应用程序设计出理想的用户界面。

转载地址:http://dcafk.baihongyu.com/

你可能感兴趣的文章
Pyinstaller和海运
查看>>
PyInstaller图标选项在Mac上不起作用
查看>>
pyinstaller的使用
查看>>
pyinstaller超级加密 (加壳和转c)
查看>>
pyinstaller错误:OSError:找不到Python库:libpython3.4mu.so.1.0、libpython3.4m.so.1.0、libpython3.4.so.1.0
查看>>
Pyinstaller:‘;Fiona‘;没有属性‘;_loading‘;(很可能是由于循环导入)
查看>>
pyinstaller:更改应用程序图标
查看>>
Pylint“未解决的导入“;Visual Studio 代码中的错误
查看>>
pyLoad远程代码执行漏洞复现(CVE-2023-0297)
查看>>
pymongo update_one(),upsert=True,不使用$运算符
查看>>
pymongo 中的快速或批量更新
查看>>
pymongo删除操作
查看>>
PyMongo按多个关键点分组
查看>>
Pympress:强大的双屏PDF阅读器
查看>>
pymysql.err.InternalError: (1054, "Unknown column '27D24A3B' in 'where clause'")之错误解决
查看>>
pymysql.err.OperationalError: (1364, “Field ‘id‘ doesn‘t have a default value“)
查看>>
Pytorch Tensor 维度操作的形象理解 Tensor.unsqueeze() Tensor.squeeze()
查看>>
PyMySQL库对Mysql数据库进行增删改查与工具类封装
查看>>
pynput的基本介绍和使用
查看>>
pyodbc 通过 IIS7 连接到 MSSQL 2005 服务器
查看>>