1 回答
TA贡献1839条经验 获得超15个赞
在将微件添加到布局时设置构件的对齐方式不会影响构件的对齐方式,而只会影响它们在布局提供的空间中的对齐方式。此外,许多小部件会自动尝试扩展自己(如 QLabel 或项目视图)。
例如,QLabel具有文本的左/垂直居中的默认对齐方式,因此您需要设置该对齐方式,但如果其他小部件允许,它仍将尝试扩展其可用空间。
要获得所需的内容,您必须考虑小部件之间的间距,它们(这表示小部件在布局中使用时对其大小的“意愿”,如果它具有固定的大小,是否可以增长/扩展,是否可以缩小等)。sizePolicy
由于您希望列之间留出一些空间,因此最简单的方法是在布局中保留空列,并使用 setColumnStretch()
在这些列上设置拉伸因子,以便它们尝试尽可能多地扩展。
最后,对于复杂的结构,最好使用嵌套布局,这意味着您将为小部件设置一个主布局,并向其添加“子”布局,以便每个“部分”都有自己的布局管理器,独立于其他布局。在下面的示例中,我实现了如下结构:
+-------------- main vertical layout ---------------+
| |
| +------------ button grid layout -------------+ |
| |title| |(empty)| |(empty)| |title| |
| +-----+----+-------+------+-------+-----+-----+ |
| |label|edit| |input | |label|edit | |
| +-----+----+-------+------+-------+-----+-----+ |
| |label|edit| |input | |label|edit | |
| +-----+----+-------+------+-------+-----+-----+ |
| |label|edit| |input | |label|edit | |
| +-----+----+-------+------+-------+-----+-----+ |
+---------------------------------------------------+
| |
| +---------- graph horizontal layout ----------+ |
| | | | |
| | left graph | right graph | |
| | | | |
| +----------------------+----------------------+ |
+---------------------------------------------------+
| |
| +--------- button horizontal layout ----------+ |
| | | | | |
| | button | (stretch) | button | |
| | | | | |
| +--------+---------------------------+--------+ |
+---------------------------------------------------+
以下是它的显示方式:
这就是代码。请注意,我从初始化中删除了小部件创建(如果您使用函数,那么在其他地方创建它们没有多大意义)。initUi
from PyQt5 import QtWidgets, QtCore
from matplotlib.figure import Figure
from matplotlib.backends.backend_qt5agg import FigureCanvasQTAgg as FigureCanvas
import sys
class Okno(QtWidgets.QMainWindow):
def __init__(self):
super(Okno, self).__init__()
self.setGeometry(500, 500, 900, 500)
self.setWindowTitle("My window")
self.iniUI()
def iniUI(self):
w = QtWidgets.QWidget()
self.setCentralWidget(w)
mainLayout = QtWidgets.QVBoxLayout(w)
grid = QtWidgets.QGridLayout()
mainLayout.addLayout(grid)
self.dataInputLabel = QtWidgets.QLabel('Data Input')
grid.addWidget(self.dataInputLabel, 0, 0)
self.dataInputLabel.setStyleSheet('color: red')
portSettingLabel = QtWidgets.QLabel('Port setting', alignment=QtCore.Qt.AlignCenter)
grid.addWidget(portSettingLabel, 0, 3)
self.dataOutputLabel = QtWidgets.QLabel('Data Output', alignment=QtCore.Qt.AlignRight|QtCore.Qt.AlignVCenter)
grid.addWidget(self.dataOutputLabel, 0, 6)
self.dataOutputLabel.setStyleSheet('color: blue')
# set the vertical policy to Maximum for labels, so they don't try to
# expand themselves if there's more available space
for label in (self.dataInputLabel, portSettingLabel, self.dataOutputLabel):
label.setSizePolicy(QtWidgets.QSizePolicy.Preferred, QtWidgets.QSizePolicy.Maximum)
grid.addWidget(QtWidgets.QLabel('Pressure [kPa]'), 1, 0)
self.inputPressure = QtWidgets.QLineEdit(readOnly=True)
grid.addWidget(self.inputPressure, 1, 1)
grid.addWidget(QtWidgets.QLabel('Temperature [K]'), 2, 0)
self.inputTemp = QtWidgets.QLineEdit(readOnly=True)
grid.addWidget(self.inputTemp, 2, 1)
grid.addWidget(QtWidgets.QLabel('Humidity [%]'), 3, 0)
self.inputHumidity = QtWidgets.QLineEdit(readOnly=True)
grid.addWidget(self.inputHumidity, 3, 1)
self.portEdit = QtWidgets.QLineEdit(placeholderText='Enter port')
grid.addWidget(self.portEdit, 1, 3)
self.baudEdit = QtWidgets.QLineEdit(placeholderText='Baudrate')
grid.addWidget(self.baudEdit, 2, 3)
self.parityEdit = QtWidgets.QLineEdit(placeholderText='Parity')
grid.addWidget(self.parityEdit, 3, 3)
grid.addWidget(QtWidgets.QLabel('Pressure [kPa]'), 1, 5)
self.outputPressure = QtWidgets.QLineEdit(readOnly=True)
grid.addWidget(self.outputPressure, 1, 6)
grid.addWidget(QtWidgets.QLabel('Temperature [K]'), 2, 5)
self.outputTemp = QtWidgets.QLineEdit(readOnly=True)
grid.addWidget(self.outputTemp, 2, 6)
grid.addWidget(QtWidgets.QLabel('Humidity [%]'), 3, 5)
self.outputHumidity = QtWidgets.QLineEdit(readOnly=True)
grid.addWidget(self.outputHumidity, 3, 6)
grid.setColumnStretch(2, 1)
grid.setColumnStretch(4, 1)
graphLayout = QtWidgets.QHBoxLayout()
mainLayout.addLayout(graphLayout)
# here insert your graphs...
self.graphLeft = FigureCanvas(Figure())
graphLayout.addWidget(self.graphLeft)
self.graphRight = FigureCanvas(Figure())
graphLayout.addWidget(self.graphRight)
buttonLayout = QtWidgets.QHBoxLayout()
mainLayout.addLayout(buttonLayout)
self.openButton = QtWidgets.QPushButton('Open file')
self.openButton.setMinimumWidth(150)
self.openButton.clicked.connect(self.open_file)
buttonLayout.addWidget(self.openButton)
# add an empty "stretch", which acts as an expanding spacer on box layouts
buttonLayout.addStretch()
self.exitButton = QtWidgets.QPushButton('Exit')
self.exitButton.clicked.connect(self.close)
buttonLayout.addWidget(self.exitButton)
最后,考虑使用Qt Designer,这对于创建复杂的布局非常有用(或者,如果您仍然想通过代码完成所有操作,则至少在设计它们的过程中可视化它们)。请注意,在这种情况下,您应该遵循使用设计器的建议准则(最重要的是,永远不要编辑使用实用程序生成的python文件),或者使用模块中的(其中是要使用ui设置的小部件/窗口)。pyuicloadUi('yourguifile.ui', self)selfPyQt5.uic
添加回答
举报