PyQt5的布局管理方法主要包括以下几种:
- 水平布局(QHBoxLayout):可以将所添加的控件在水平方向上依次排列。
- 垂直布局(QVBoxLayout):可以将所添加的空间在垂直方向上依次排列。
- 网格布局(QGridLayout):可以将所添加的空间以网络的形式排列。
- 表单布局(QFormLayout):可以将所添加的空间以两列的形式排列。
- 绝对位置布局:主要是通过在窗口程序中指定每一个空间的显示坐标和大小来实现的。
- addLayout():用于在布局中插入子布局。
- addWidget():用于在布局中插入控件。
布局管理器(layout)
PyQt5的布局管理主要是通过使用布局管理器(layout)来实现的。
布局管理器是一种用于自动排列窗口中的界面组件的机制,能够根据窗口大小的变化自动更新界面组件的大小。
在PyQt5中,常见的布局管理器包括水平布局(QHBoxLayout)、垂直布局(QVBoxLayout)、网格布局(QGridLayout)和表单布局(QFormLayout)。
水平布局管理器(QHBoxLayout)
水平布局管理器可以将所添加的控件在水平方向上依次排列。示例代码如下:
from PyQt5.QtWidgets import QApplication, QWidget, QHBoxLayout, QLineEdit, QPushButton
app = QApplication([])
window = QWidget()
hbox = QHBoxLayout()
cb2 = QLineEdit()
cb2.setFixedWidth(257)
cb3 = Button() // 重写QPushButton方法
cb3.setFixedSize(23, 13)
cb3.setStyleSheet('border-image: url("Mesh/file.png"); margin-right: 6px;')
cb3.clicked.connect(lambda:self.select_file(cb, cb2))
hbox.addWidget(cb2)
hbox.addWidget(cb3)
window.setLayout(hbox)
window.show()
app.exec_()
效果如图:
以上代码实现了在一个输入框中放入一个按钮,因此用到了水平布局。
垂直布局管理器(QVBoxLayout)
垂直布局管理器可以将所添加的空间在垂直方向上依次排列。示例代码如下:
from PyQt5.QtWidgets import QApplication, QWidget, QVBoxLayout, QLineEdit, QLabel
app = QApplication([])
window = QWidget()
layout = QVBoxLayout()
tetra = Label('▼Tetra/mixed', 'bgplain', False) // 重写QLabel方法
meshmethod = QLineEdit('Mesh Method')
layout.addWidget(tetra)
layout.addWidget(meshmethod)
window.setLayout(layout)
window.show()
app.exec_()
效果如图:
网格布局管理器(QGridLayout)
网格布局管理可以将所添加的空间以网格的形式排列。示例代码如下:
from PyQt5.QtWidgets import QApplication, QWidget, QGridLayout, QPushButton
app = QApplication([])
window = QWidget()
layout = QGridLayout()
button1 = QPushButton('Button 1')
button2 = QPushButton('Button 2')
layout.addWidget(button1, 0, 0)
layout.addWidget(button2, 1, 0)
window.setLayout(layout)
window.show()
app.exec_()
表单布局管理器(QFormLayout)
表单布局管理器可以将所添加的空间以两列的形式排列。示例代码如下:
from PyQt5.QtWidgets import QApplication, QWidget, QFormLayout, QLineEdit, QLabel
app = QApplication([])
window = QWidget()
fill = QFormLayout()
label1 = Label('Viscosity') // 重写QLabel方法
label2 = Label('Density')
line1 = LineEdit('WaterViscosity')
line2 = LineEdit('WaterDensity')
fill.addRow(label1, line1)
fill.addRow(label2, line2)
window.setLayout(fill)
window.show()
app.exec_()
效果如图:
布局调整
在PyQt5中,addSpacing
和 addStretch
都是用于调整控件布局的函数。
addSpacing
方法用于在布局中添加一个具有指定像素值的空白区域。这个方法接受一个参数,即空白区域的像素值。通过添加空白区域,可以调整控件之间的间距,使布局更加美观。
下面是一个使用 addSpacing
方法的示例代码:
from PyQt5.QtWidgets import QApplication, QWidget, QPushButton, QVBoxLayout
app = QApplication([])
window = QWidget()
layout = QVBoxLayout()
button1 = QPushButton('Button 1')
button2 = QPushButton('Button 2')
layout.addWidget(button1)
layout.addWidget(button2)
layout.addSpacing(10)# 在两个按钮之间添加10像素的空白区域
window.setLayout(layout)
window.show()
app.exec_()
在上面的示例中,通过调用 addSpacing
方法,在两个按钮之间添加了一个10像素的空白区域,使布局更加清晰可读。
addStretch
方法用于在布局中添加一个可拉伸的空白区域。这个方法不接受任何参数,它会根据窗口的大小自动拉伸或缩小,以填充布局中的可用空间。通过添加可拉伸的空白区域,可以调整控件之间的填充效果,使布局更加灵活。
下面是一个使用 addStretch
方法的示例代码:
from PyQt5.QtWidgets import QApplication, QWidget, QCheckBox, QVBoxLayout
app = QApplication([])
window = QWidget()
layout = QHBoxLayout()
label = Label('Temperature effect')
cb = QCheckBox()
cb.setStyleSheet('border: none;')
layout.addWidget(label)
layout.addStretch(1) # 在两个控件之间添加一个可拉伸的空白区域
layout.addWidget(cb)
window.setLayout(layout)
window.show()
app.exec_()
效果如图:
在上面的示例中,通过调用 addStretch
方法,在两个控件之间添加了一个可拉伸的空白区域,当窗口大小变化时,这个区域会自动拉伸或缩小,以填充可用空间。
同时也是相当于是实现了水平两端对齐 (QtCore.Qt.AlignJustify)。可以利用 addStretch
实现各种布局对齐方式:
参数 | 描述 |
---|---|
QtCore.Qt.AlignLeft | 水平方向居左对齐 |
QtCore.Qt.AlignRight | 水平方向居右对齐 |
QtCore.Qt.AlignCenter | 水平方向居中对齐 |
QtCore.Qt.AlignJustify | 水平方向两端对齐 |
QtCore.Qt.AlignTop | 垂直方向靠上对齐 |
QtCore.Qt.AlignBottom | 垂直方向靠下对齐 |
QtCore.Qt.AlignVCenter | 垂直方向居中对齐 |
布局管理方法
在上面的示例代码中,用到了 addLayout
和 addWidget
。
在PyQt5中,addLayout
和 addWidget
是两个非常重要的布局管理方法,它们分别用于在布局中插入子布局和在布局中插入控件。
addLayout
方法用于将一个布局添加到另一个布局中,它通常用于实现更复杂的布局管理。例如,你可以使用addLayout
方法将一个水平布局添加到一个垂直布局中,或者将一个网格布局添加到一个表单布局中。addWidget
方法用于将一个控件添加到布局中,它比addLayout方法更简单。例如,你可以使用addWidget
方法将一个按钮添加到一个水平布局中,或者将一个文本框添加到一个表单布局中。