pyqt5 布局管理

pyqt的布局管理,应该算是pyqt中入门的基础,是掌握pyqt界面设计中的基础中的基础,掌握后能够快速进行界面设计及相关软件的开发。

pyqt的布局分类:

1. 绝对布局:

这种布局就是没有布局,一般新手上来随便在qt designer中随便放置控件的布局就是这个,简称没有布局。

实际上这种布局就是以像素为基本单位,以相对坐标确定每个控件的基本位置,如果不使用qt designer的话,使用这种布局需要掌握俩个函数:

move(),这个函数是放置每个空间的位置,两个参数,一个是x轴一个是y轴,原点是窗口的左上角(注意不要包含任务栏)

setGeometry(),这个函数就是设置窗口的大小的,有四个参数,前两个参数是设置窗口相对于屏幕左上角的位置的,后面两个参数是设置窗口宽和高的。

举例:

# -*- coding: utf-8 -*-
from PyQt5 import QtCore, QtGui, QtWidgets
import sys
 
class WindowDemo(QtWidgets.QMainWindow):
    def __init__(self):
        super(WindowDemo,self).__init__()
        self.setup_ui()

    def setup_ui(self):
        self.label = QtWidgets.QLabel('demo', self)
        self.label.move(15, 10)
        self.setGeometry(300, 300, 250, 150)
        
 
if __name__ == "__main__":
    app = QtWidgets.QApplication(sys.argv)
    MainWindow = WindowDemo()
    MainWindow.show()
    sys.exit(app.exec_())

直接运行就可以得到如下窗口

但是这种布局使用的不多,主要是优缺点都很明显,首先是优点,这种布局可以让程序员直接确定每个控件的具体的位置,缺点就是这种布局过于死板,换个屏幕可能表现就不一样了,而且控件位置会随着窗口的缩放改变原有的位置,造成一堆的问题。整体来看这种布局就有点像是c语言,直接把地址也就是指针暴露给程序员,虽然很强大,但是实际上并不太好用。

2. 四种布局类:(水平布局QHBoxLayout,垂直布局QVBoxLayout,网格布局QGridLayout,表单布局QFormLayout)

这四种布局相当于给窗口先打好了一个草稿,放置控件时会遵守打好的草稿来放置控件。

水平布局QHBoxLayout:

这种布局默认是这样的,类似于部队一个班站一横排,每个控件各占一个位置,类似于这种:

from PyQt5 import QtCore, QtGui, QtWidgets
import sys
 
class WindowDemo(QtWidgets.QWidget):
    def __init__(self):
        super(WindowDemo,self).__init__()
        self.setup_ui()

    def setup_ui(self):
        self.layout = QtWidgets.QHBoxLayout()
        for i in range(3):
            self.layout.addWidget(QtWidgets.QPushButton(str(i)))
        self.setLayout(self.layout)
        
if __name__ == "__main__":
    app = QtWidgets.QApplication(sys.argv)
    MainWindow = WindowDemo()
    MainWindow.show()
    sys.exit(app.exec_())

(这个代码中和上面的demo有一点区别,在于继承的QtWidgets的窗口类不同,这个继承的是QWidget,区别后面的文章会有总结)

垂直布局QVBoxLayout:

这种布局就是一个班站一竖排,像这种

刚刚的代码只需要修改下布局方式就好,把QHBoxLayout改成QVBoxLayout就行了

# -*- coding: utf-8 -*-
from PyQt5 import QtCore, QtGui, QtWidgets
import sys
 
class WindowDemo(QtWidgets.QWidget):
    def __init__(self):
        super(WindowDemo,self).__init__()
        self.setup_ui()

    def setup_ui(self):
        self.layout = QtWidgets.QVBoxLayout()
        for i in range(3):
            self.layout.addWidget(QtWidgets.QPushButton(str(i)))
        self.setLayout(self.layout)
        
if __name__ == "__main__":
    app = QtWidgets.QApplication(sys.argv)
    MainWindow = WindowDemo()
    MainWindow.show()
    sys.exit(app.exec_())

网格布局QGridLayout:

这种布局就就是一个排站成一个队伍,像下面这样:

# -*- coding: utf-8 -*-
from PyQt5 import QtCore, QtGui, QtWidgets
import sys
 
class WindowDemo(QtWidgets.QWidget):
    def __init__(self):
        super(WindowDemo,self).__init__()
        self.setup_ui()

    def setup_ui(self):
        self.layout = QtWidgets.QGridLayout()
        for i in range(3):
            for j in range(5):
                self.layout.addWidget(QtWidgets.QPushButton(str(i)),i,j)
        self.setLayout(self.layout)
        
if __name__ == "__main__":
    app = QtWidgets.QApplication(sys.argv)
    MainWindow = WindowDemo()
    MainWindow.show()
    sys.exit(app.exec_())

表单布局QFormLayout:

这种布局就是类似于我们平时用的表格,填个表吧,前面是姓名,然后留空填,再一行是年龄,然后留空填,类似于下面这种:

# -*- coding: utf-8 -*-
from PyQt5 import QtCore, QtGui, QtWidgets
import sys
 
class WindowDemo(QtWidgets.QWidget):
    def __init__(self):
        super(WindowDemo,self).__init__()
        self.setup_ui()

    def setup_ui(self):
        self.layout = QtWidgets.QFormLayout()
        self.label0 = QtWidgets.QLabel("姓名")
        self.lineedit0 = QtWidgets.QLineEdit()
        self.label1 = QtWidgets.QLabel("年龄")
        self.lineedit1 = QtWidgets.QLineEdit()
        self.layout.addRow(self.label0,self.lineedit0)
        self.layout.addRow(self.label1,self.lineedit1)
        self.setLayout(self.layout)

if __name__ == "__main__":
    app = QtWidgets.QApplication(sys.argv)
    MainWindow = WindowDemo()
    MainWindow.show()
    sys.exit(app.exec_())

这几种布局这样做的好处就是程序员不需要再去考虑具体的坐标,只用考虑每个控件的相对位置,放置好后再根据相对位置再 

目前来看,这几种布局是使用最多的布局,使用起来简单方便,解决了绝对布局的几个缺点,但是同时绝对布局的优点也没了。

 

下面就具体说明下这几种布局类的一些使用方法:

控件的对齐方式:

参数描述

QtCore.Qt.AlignLeft

水平居左对齐
QtCore.Qt.AlignRight水平居右对齐
QtCore.Qt.AlignCenter水平居中对齐
QtCore.Qt.AlignJustify水平两端对齐
QtCore.Qt.AlignTop垂直靠上对齐
QtCore.Qt.AlignBottom垂直靠下对齐
QtCore.Qt.AlignVCenter垂直居中对齐

使用起来非常简单,比如之前代码里面一直使用的一个添加控件的语句:

self.layout.addWidget(QtWidgets.QPushButton(str(i)))

 直接再后面添加这种语句就行了

self.layout.addWidget(QtWidgets.QPushButton(str(i)),Qt.AlignTop)

并且可以一起用,用 | 隔开就行了

self.layout.addWidget(QtWidgets.QPushButton(str(i)),QtCore.Qt.AlignTop| QtCore.Qt.AlignLeft)

水平及垂直布局控件的添加方法:

方法描述
addLayout(self, QLayout, stretch = 0)在窗口中添加布局,stretch为伸缩量,默认为0
addWidget(self, QWidget, stretch, Qt.Alignment alignment)在布局中添加控件,stretch为伸缩量,alignment为对齐方式
addSpacing(self, int)添加伸缩量,就是控件之间的留白

网格布局控件的添加方法:

方法描述
addWidget(QWidget widget, int row, int col, int alignment = 0)给网格布局添加控件。
widget:要添加的控件
row:位置所在行
col:位置所在列
alignment:对齐方式
addWidget(QWidget widget, int fromRow, int fromColumn, int rowSpan, int columnSpan, int alignment)当所添加的控件跨越多行或多列时,使用这个函数
fromRow:起始行
fromColumn:起始列
rowSpan:控件跨越的行
columnSpan:控件跨越的列
setSpacing(int spacing)设置控件在水平和垂直方向的间隔

表单布局控件的添加方法:

 addRow(label, field)

最后一种,嵌套布局,就是将这几种布局嵌套着使用,不涉及新方法和使用相关,就不再举例细讲了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值