QGridLayout不同列宽度

8
我正在尝试创建以下布局:
 _________
|  |      |
|1 |   2  |
|__|______|
|  3 | 4  |
|____|____|

基本上,我希望第一行的单元格1比单元格2更窄,但第二行的单元格3和4应具有相等的宽度。

使用PyQt4中的QGridLayout创建这样的布局是否可能?

1个回答

21

QGridLayout的任务是创建这种类型的布局结构,为此您必须使用以下函数:

void QGridLayout::addWidget(QWidget* widget, int fromRow, int fromColumn, int rowSpan, int columnSpan, Qt::Alignment alignment = 0)

这是一个重载函数。

这个版本将给定的widget添加到单元格网格中,跨越多行/列。该单元格将从fromRow,fromColumn开始跨越rowSpan行和columnSpan列。widget将具有给定的对齐方式。

如果rowSpan和/或columnSpan是-1,则widget将分别延伸到底部和/或右侧边缘。

例如:

import sys

from PyQt4.QtCore import *
from PyQt4.QtGui import *

app = QApplication(sys.argv)
w = QWidget()
glay = QGridLayout(w)
glay.addWidget(QLabel("1"), 0, 0)
glay.addWidget(QLabel("2"), 0, 1, 1, 3)
glay.addWidget(QLabel("3"), 1, 0, 1, 2)
glay.addWidget(QLabel("4"), 1, 2, 1, 2)

qsrand(QTime.currentTime().msec())

for label in w.findChildren(QLabel):
    color = QColor(qrand() % 256, qrand() % 256, qrand() % 256)
    label.setStyleSheet('.QLabel{{background: rgb({}, {}, {});}}'.format(color.red(), color.green(), color.blue()))

w.show()
sys.exit(app.exec_())

enter image description here


非常好。(尽管由于公司安全政策我无法看到快照)出于好奇:使用3列的网格是否也可以?(我的意思是:标签“2”跨越2列,标签“4”跨越1列。) - Scheff's Cat
1
根据问题作者提供的图表,可以观察到标签1必须比标签2、标签3和标签4的权重低;标签3与标签4具有相同的权重,因此一种解决方案是标签具有以下权重:label1 = 1label2 = 3label3 = 2label4 = 3 - eyllanesc
好的,我明白了。嗯,有没有可能使用类似于权重的东西来进行布局呢?(我记得这是与我之前使用的GtkTable的主要区别。) - Scheff's Cat
2
Qt并没有直接实现权重,另一个选项是使用拉伸函数,请查看我的其他答案:https://stackoverflow.com/questions/47681774/qgridlayout-with-plotwidget-pyqtgraph - eyllanesc

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接