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)
最后一种,嵌套布局,就是将这几种布局嵌套着使用,不涉及新方法和使用相关,就不再举例细讲了。