本文共 3763 字,大约阅读时间需要 12 分钟。
布局管理是我们如何将小部件放置在应用程序窗口上的方式。在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用于水平排列小部件,常用于将多个控件放置在窗口的底部或顶部。以下示例展示了如何在窗口的右下角放置两个按钮:
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 是最通用的布局类,可将空间划分为行和列。以下是创建一个计算器框架的示例:
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/