当前位置:   article > 正文

python -- PyQt5(designer)中文详细教程(三)布局管理_pqt5 designer 官方教学

pqt5 designer 官方教学

布局管理

        在⼀个GUI程序⾥,布局是⼀个很重要的⽅⾯。布局就是如何管理应⽤中的元素和窗口。有两种方式可以搞定:绝对定位和PyQt5的layout类

绝对定位

        每个程序都是以像素为单位区分元素的位置,衡量元素的大小。所以我们完全可以使用绝对定位搞定每个元素和窗口的位置。但是这也有局限性:

        元素不会随着我们更改窗口的位置和大小而变化。

        不能适用于不同的平台和不同分辨率的显⽰器

        更改应用字体大小会破坏布局

        如果我们决定重构这个应用,需要全部计算⼀下每个元素的位置和大小 

下面这个就是绝对定位的应用   

  1. import sys
  2. from PyQt5.QtWidgets import QWidget, QLabel, QApplication
  3. class Example(QWidget):
  4. def __init__(self):
  5. super().__init__()
  6. self.initUI()
  7. def initUI(self):
  8. lbl1 = QLabel('Zetcode', self)
  9. lbl1.move(15, 10)
  10. lbl2 = QLabel('tutorials', self)
  11. lbl2.move(35, 40)
  12. lbl3 = QLabel('for programmers', self)
  13. lbl3.move(55, 70)
  14. self.setGeometry(300, 300, 400, 150)
  15. self.setWindowTitle('Absolute')
  16. self.show()
  17. if __name__ == '__main__':
  18. app = QApplication(sys.argv)
  19. ex = Example()
  20. sys.exit(app.exec_())

我们使⽤move()⽅法定位了每⼀个元素,使用x、y坐标。x、y坐标的原点是程序的左上⾓。

        lbl1 = QLabel('Zetcode', self)

        lbl1.move(15, 10)

这个元素的左上⾓就在这个程序的左上⾓开始的(15, 10)的位置。

程序展⽰:

盒布局

        使用盒布局能让程序具有更强的适应性。这个才是布局⼀个应⽤的更合适的⽅式。 QHBoxLayout 和 QVBoxLayout 是基本的布局类,分别是水平布局和垂直布局。

        如果我们需要把两个按钮放在程序的右下角,创建这样的布局,我们只需要⼀个水平布局加⼀个垂直布局的盒子就可以了。再用弹性布局增加⼀点间隙。

  1. import sys
  2. from PyQt5.QtWidgets import (QWidget, QPushButton,
  3. QHBoxLayout, QVBoxLayout, QApplication)
  4. class Example(QWidget):
  5. def __init__(self):
  6. super().__init__()
  7. self.initUI()
  8. def initUI(self):
  9. okButton = QPushButton("OK")
  10. cancelButton = QPushButton("Cancel")
  11. hbox = QHBoxLayout()
  12. hbox.addStretch(1)
  13. hbox.addWidget(okButton)
  14. hbox.addWidget(cancelButton)
  15. vbox = QVBoxLayout()
  16. vbox.addStretch(1)
  17. vbox.addLayout(hbox)
  18. self.setLayout(vbox)
  19. self.setGeometry(300, 300, 300, 150)
  20. self.setWindowTitle('Buttons')
  21. self.show()
  22. if __name__ == '__main__':
  23. app = QApplication(sys.argv)
  24. ex = Example()
  25. sys.exit(app.exec_())

         上面的例子完成了在应用的右下角放了两个按钮的需求。当改变窗口大小的时候,它们能依然保持在相对的位置。我们同时使用了 QHBoxLayout 和 QVBoxLayout 。

        okButton = QPushButton("OK")
        cancelButton = QPushButton("Cancel")

这是创建了两个按钮。

        hbox = QHBoxLayout()
        hbox.addStretch(1)
        hbox.addWidget(okButton)
        hbox.addWidget(cancelButton)

创建⼀个水平布局,增加两个按钮和弹性空间。stretch函数在两个按钮前面增加了⼀些弹性空间。 下⼀步我们把这些元素放在应用的右下角。

        vbox = QVBoxLayout()
        vbox.addStretch(1)
        vbox.addLayout(hbox)

为了布局需要,我们把这个⽔平布局放到了⼀个垂直布局盒里面。弹性元素会把所有的元素⼀起都 放置在应用的右下角。

        self.setLayout(vbox)

最后,我们就得到了我们想要的布局。

预览:

栅格布局

最常用的还是栅格布局了。这种布局是把窗口分为行和列。创建和使用栅格布局,需要使用 QGridLayout模块。

  1. import sys
  2. from PyQt5.QtWidgets import (QWidget, QGridLayout,
  3. QPushButton, QApplication)
  4. class Example(QWidget):
  5. def __init__(self):
  6. super().__init__()
  7. self.initUI()
  8. def initUI(self):
  9. grid = QGridLayout()
  10. self.setLayout(grid)
  11. names = ['Cls', 'Bck', '', 'Close',
  12. '7', '8', '9', '/',
  13. '4', '5', '6', '*',
  14. '1', '2', '3', '-',
  15. '0', '.', '=', '+']
  16. positions = [(i,j) for i in range(5) for j in range(4)]
  17. for position, name in zip(positions, names):
  18. if name == '':
  19. continue
  20. button = QPushButton(name)
  21. grid.addWidget(button, *position)
  22. # print(*positions) # 结果是
  23. # (0, 0) (0, 1) (0, 2) (0, 3)
  24. # (1, 0) (1, 1) (1, 2) (1, 3)
  25. # (2, 0) (2, 1) (2, 2) (2, 3)
  26. # (3, 0) (3, 1) (3, 2) (3, 3)
  27. # (4, 0) (4, 1) (4, 2) (4, 3)
  28. self.move(300, 150)
  29. self.setWindowTitle('Calculator')
  30. self.show()
  31. if __name__ == '__main__':
  32. app = QApplication(sys.argv)
  33. ex = Example()
  34. sys.exit(app.exec_())

这个例⼦⾥,我们创建了栅格化的按钮。

grid = QGridLayout()

self.setLayout(grid)

创建⼀个QGridLayout实例,并把它放到程序窗口里。

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)

创建按钮,并使用 addWidget() ⽅法把按钮放到布局里面。

程序预览:

制作提交反馈信息的布局

        组件能跨列和跨行展示,这个例子里,我们就试试这个功能。

  1. import sys
  2. from PyQt5.QtWidgets import (QWidget, QLabel, QLineEdit,
  3. QTextEdit, QGridLayout, QApplication)
  4. class Example(QWidget):
  5. def __init__(self):
  6. super().__init__()
  7. self.initUI()
  8. def initUI(self):
  9. title = QLabel('Title')
  10. author = QLabel('Author')
  11. review = QLabel('Review')
  12. titleEdit = QLineEdit() # QLineEdit 只有⼀⾏
  13. authorEdit = QLineEdit()
  14. reviewEdit = QTextEdit() # QTextEdit 不⽌⼀⾏
  15. grid = QGridLayout()
  16. grid.setSpacing(10) # 珊格间隙的像素值,单位是像素
  17. grid.addWidget(title, 1, 0)
  18. grid.addWidget(titleEdit, 1, 1)
  19. grid.addWidget(author, 2, 0)
  20. grid.addWidget(authorEdit, 2, 1)
  21. grid.addWidget(review, 3, 0)
  22. grid.addWidget(reviewEdit, 3, 1, 5, 1)
  23. self.setLayout(grid)
  24. self.setGeometry(300, 300, 350, 300)
  25. self.setWindowTitle('Review')
  26. self.show()
  27. if __name__ == '__main__':
  28. app = QApplication(sys.argv)
  29. ex = Example()
  30. sys.exit(app.exec_())

 我们创建了⼀个有三个标签的窗口。两个行编辑和⼀个文版编辑,这是用 QGridLayout 模块搞定 的。

        grid = QGridLayout()

        grid.setSpacing(10)

创建标签之间的空间。

        grid.addWidget(reviewEdit, 3, 1, 5, 1)

我们可以指定组件的跨行和跨列的大小。这里我们指定这个元素跨5行显⽰。

程序预览:

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Monodyee/article/detail/76268
推荐阅读
相关标签
  

闽ICP备14008679号