setColumnStretch 和 setRowStretch 如何工作
How does setColumnStretch and setRowStretch works
我有一个使用 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())
第一种方式是将widget放置在item所占的"row"和"column"位置,第二种方式是widget所占的行数或列数可以是表示,它们等同于:
def addWidget(self, row, column, rowSpan = 1, colSpan = 1, alignment = Qt.Alignment()):
pass
所以在lay.addWidget(widget, 2, 0, 1, 3)
中表示"widget"会被放在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,则所有小部件的大小将相同,但很多时候您希望小部件占用更多空间 space,或者大小成比例。为了理解逻辑,我将使用以下代码:
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_())
确定第一列的stretch为1,第二列为2,第三列为3,即行大小的比例1:2:3
如果将拉伸设置为 0 会怎样?好吧,它会占据最小尺寸,那些拉伸> 0的会保持比例:
glay.setRowStretch(0, 0)
glay.setRowStretch(1, 1)
glay.setRowStretch(2, 2)
相同的概念适用于 setColumnStretch()。
我有一个使用 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())
第一种方式是将widget放置在item所占的"row"和"column"位置,第二种方式是widget所占的行数或列数可以是表示,它们等同于:
def addWidget(self, row, column, rowSpan = 1, colSpan = 1, alignment = Qt.Alignment()): pass
所以在
lay.addWidget(widget, 2, 0, 1, 3)
中表示"widget"会被放在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,则所有小部件的大小将相同,但很多时候您希望小部件占用更多空间 space,或者大小成比例。为了理解逻辑,我将使用以下代码:
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_())
确定第一列的stretch为1,第二列为2,第三列为3,即行大小的比例1:2:3
如果将拉伸设置为 0 会怎样?好吧,它会占据最小尺寸,那些拉伸> 0的会保持比例:
glay.setRowStretch(0, 0) glay.setRowStretch(1, 1) glay.setRowStretch(2, 2)
相同的概念适用于 setColumnStretch()。