1 回答

TA貢獻(xiàn)1839條經(jīng)驗 獲得超15個贊
在將微件添加到布局時設(shè)置構(gòu)件的對齊方式不會影響構(gòu)件的對齊方式,而只會影響它們在布局提供的空間中的對齊方式。此外,許多小部件會自動嘗試擴(kuò)展自己(如 QLabel 或項目視圖)。
例如,QLabel具有文本的左/垂直居中的默認(rèn)對齊方式,因此您需要設(shè)置該對齊方式,但如果其他小部件允許,它仍將嘗試擴(kuò)展其可用空間。
要獲得所需的內(nèi)容,您必須考慮小部件之間的間距,它們(這表示小部件在布局中使用時對其大小的“意愿”,如果它具有固定的大小,是否可以增長/擴(kuò)展,是否可以縮小等)。sizePolicy
由于您希望列之間留出一些空間,因此最簡單的方法是在布局中保留空列,并使用 setColumnStretch()
在這些列上設(shè)置拉伸因子,以便它們嘗試盡可能多地擴(kuò)展。
最后,對于復(fù)雜的結(jié)構(gòu),最好使用嵌套布局,這意味著您將為小部件設(shè)置一個主布局,并向其添加“子”布局,以便每個“部分”都有自己的布局管理器,獨立于其他布局。在下面的示例中,我實現(xiàn)了如下結(jié)構(gòu):
+-------------- 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 | |
| | | | | |
| +--------+---------------------------+--------+ |
+---------------------------------------------------+
以下是它的顯示方式:
這就是代碼。請注意,我從初始化中刪除了小部件創(chuàng)建(如果您使用函數(shù),那么在其他地方創(chuàng)建它們沒有多大意義)。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,這對于創(chuàng)建復(fù)雜的布局非常有用(或者,如果您仍然想通過代碼完成所有操作,則至少在設(shè)計它們的過程中可視化它們)。請注意,在這種情況下,您應(yīng)該遵循使用設(shè)計器的建議準(zhǔn)則(最重要的是,永遠(yuǎn)不要編輯使用實用程序生成的python文件),或者使用模塊中的(其中是要使用ui設(shè)置的小部件/窗口)。pyuicloadUi('yourguifile.ui', self)selfPyQt5.uic
添加回答
舉報