pythonGUI编程——Qt库(2)界面布局

本文详细介绍了PyQt5中的三种布局方式:绝对定位、框布局和表格布局,并通过实例展示了每种布局的特点和使用方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

       PyQt5页面布局提供两种方式绝对定位和布局类。

1.绝对定位。

       绝对定位即程序指定每个控件的位置和大小(以像素为单位)。例如:

#!/usr/bin/python
#coding:utf-8
import sys
from PyQt5.QtWidgets import QWidget,QLabel,QApplication

class Example(QWidget):
    def __init__(self):
        super().__init__()
        self.initUI()


    def initUI(self):
        #写控件
        lb11 = QLabel('Zetcode',self)
        #move()控制控件在弹窗上的位置
        lb11.move(15,10)

        lb12 = QLabel('tutorials',self)
        lb12.move(35,40)

        lb13 = QLabel('for programmers',self)
        lb13.move(55,70)
        #四个参数前两个是屏幕上的位置,后两个窗口长宽
        self.setGeometry(300,300,250,250)
        self.setWindowTitle('Absolute')
        self.show()

if __name__ == '__main__':
    app = QApplication(sys.argv)
    ex = Example()
    sys.exit(app.exec_())

运行生成结果:
                                                 在这里插入图片描述
       绝对定位有一下几点弊端:

  • 如果我们调整窗口,控件的大小和位置不会改变。
  • 在各种平台上应用程序看起来会不一样。
  • 如果改变字体,我们的应用程序的布局就会改变。
  • 如果我们决定改变我们的布局,我们必须完全重做我们的布局。

2.框布局 Boxlayout。

       可以使用QHBoxLayout和QVBoxLayout,来分别创建横向布局和纵向布局。例如:

#!/usr/bin/python
#coding:utf-8
import sys
from PyQt5.QtWidgets import *

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()

if __name__ == '__main__':
    app = QApplication(sys.argv)
    ex = Example()
    sys.exit(app.exec_())

运行效果图:
                                                在这里插入图片描述

3.表格布局 QGridLayout。

       表格布局将空间划分为行和列。使用QGridLayout类创建一个网格布局。例如:
(1)计算器例子。

#!/usr/bin/python
#coding:utf-8
import sys
from PyQt5.QtWidgets import *

class Example(QWidget):
    def __init__(self):
        super().__init__()

        self.initUI()

    def initUI(self):
        #创建QGridLayout实例
        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)]
        
        #创建按钮并使用addWidget()方法添加到布局中
        for positions,name in zip(positions,names):
            if name == '':
                continue
            button = QPushButton(name)
            grid.addWidget(button,*positions)

        self.move(300,150)
        self.setWindowTitle('Calculator')
        self.show()

if __name__ == '__main__':

    app = QApplication(sys.argv)
    ex = Example()
    sys.exit(app.exec_())

       zip() 函数用于将可迭代的对象作为参数,将对象中对应的元素打包成一个个元组,然后返回由这些元组组成的列表。如果各个迭代器的元素个数不一致,则返回列表长度与最短的对象相同,利用 * 号操作符,可以将元组解压为列表。
运行效果图:
                                                在这里插入图片描述
(2)评论例子。

#!/usr/bin/python
#coding:utf-8
import sys
from PyQt5.QtWidgets import *

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()
        #创建一个网格布局,设置组件之间的间距为10px
        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()

if __name__ == '__main__':

    app = QApplication(sys.argv)
    ex = Example()
    sys.exit(app.exec_())

       控件可以在网格中跨越多个行或列。在添加一个小的控件到网格的时候,我们可以提供小部件的行和列跨。grid.addWidget(reviewEdit,3,1,5,1)中5表示reviewEdit控件跨度5行。
运行效果图:
                                                在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

晶晶娃在战斗

你的鼓励将是我创作的最大动力!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值