我有一个使用PySide2
构建的应用程序,该应用程序将setColumnStretch
用于列拉伸,将setRowStretch
用于行拉伸。它工作的很好,但是我无法理解它是如何工作的。我指的是qt文档,但对我没有帮助。我被那些括号内的两个值所困扰。
例如:
glay = QtWidgets.QGridLayout(right_container)
glay.addWidget(lineedit, 0, 0)
glay.addWidget(button2, 0, 2)
glay.addWidget(widget, 2, 0, 1, 3)
glay.addWidget(button, 4, 0)
glay.addWidget(button1, 4, 2)
glay.setColumnStretch(1, 1) # setColumnStretch
glay.setRowStretch(1, 1) # setRowStretch
glay.setRowStretch(2, 2) # setRowStretch
glay.setRowStretch(3, 1) # setRowStretch
但是如何? glay.addWidget(widget, 2, 0, 1, 3)
中的这四个值有什么作用?请用示例向我解释一下。
提前感谢...
简短回答:阅读Qt文档:https://doc.qt.io/qt-5/qgridlayout.html,因为它清晰准确。
长回答:
addWidget()
:
addWidget方法是重载的(该概念本身在C ++中存在,但可以在python中构建,但默认情况下不存在),这意味着方法(或函数)根据参数的不同而具有不同的行为,在这种情况下:] >
void addWidget(QWidget *widget, int row, int column, Qt::Alignment alignment = Qt::Alignment()) void addWidget(QWidget *widget, int fromRow, int fromColumn, int rowSpan, int columnSpan, Qt::Alignment alignment = Qt::Alignment())
[第一种方法表明小部件将被放置在项目所占据的“行”和“列”的位置,第二种方法可以表明其所占据的行数或列数,它们等效于:
def addWidget(self, row, column, rowSpan = 1, colSpan = 1, alignment = Qt.Alignment()): pass
因此,在
lay.addWidget(widget, 2, 0, 1, 3)
中,这意味着“小部件”将放置在位置2x0处,并将占据1行和3列。
import random
import sys
from PyQt5 import QtGui, QtWidgets
if __name__ == "__main__":
app = QtWidgets.QApplication(sys.argv)
w = QtWidgets.QWidget()
glay = QtWidgets.QGridLayout(w)
elements = (
(0, 0, 1, 1), # Position: 0x0 1 rowspan 1 colspan
(1, 0, 1, 1), # Position: 1x0 1 rowspan 1 colspan
(0, 1, 2, 1), # Position: 0x1 2 rowspan 1 colspan
(2, 0, 1, 2), # Position: 2x0 1 rowspan 2 colspan
)
for i, (row, col, row_span, col_span) in enumerate(elements):
label = QtWidgets.QLabel("{}".format(i))
color = QtGui.QColor(*random.sample(range(255), 3))
label.setStyleSheet("background-color: {}".format(color.name()))
glay.addWidget(label, row, col, row_span, col_span)
w.resize(640, 480)
w.show()
sys.exit(app.exec_())
[setColumnStretch()
和setRowStretch()
:
默认情况下,如果QGridLayout填充有相同的小部件,并且rowSpan和columnSpan为1,则所有小部件的大小均相同,但是很多时候您希望小部件占用更多空间,或者大小成比例。为了理解逻辑,我将使用以下代码:
import random
import sys
from PyQt5 import QtGui, QtWidgets
if __name__ == "__main__":
app = QtWidgets.QApplication(sys.argv)
w = QtWidgets.QWidget()
glay = QtWidgets.QGridLayout(w)
for i in range(3):
for j in range(3):
label = QtWidgets.QLabel("{}x{}".format(i, j))
color = QtGui.QColor(*random.sample(range(255), 3))
label.setStyleSheet("background-color: {}".format(color.name()))
glay.addWidget(label, i, j)
glay.setRowStretch(0, 1)
glay.setRowStretch(1, 2)
glay.setRowStretch(2, 3)
w.resize(640, 480)
w.show()
sys.exit(app.exec_())
已确定第一列的长度为1,第二列的长度为2,第三列的长度为3,这是行的大小之比1:2:3
如果将Stretch设置为0会发生什么?如果将stretch设置为0,会发生什么?好吧,它将占据最小尺寸,并且拉伸大于0的那些将保持比例:
glay.setRowStretch(0, 0)
glay.setRowStretch(1, 1)
glay.setRowStretch(2, 2)
相同的概念适用于setColumnStretch()。