【问题标题】:QGridLayout different column widthQGridLayout不同的列宽
【发布时间】:2018-06-03 06:13:07
【问题描述】:

我正在尝试创建一个如下所示的布局:

 _________
|  |      |
|1 |   2  |
|__|______|
|  3 | 4  |
|____|____|

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

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

【问题讨论】:

    标签: python pyqt pyqt4 qlayout qgridlayout


    【解决方案1】:

    QGridLayout 的任务是创建那种类型的结构,为此你必须使用函数:

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

    这是一个重载函数。

    此版本将给定的小部件添加到单元格网格中,跨越多个 行/列。单元格将从 fromRow 开始,fromColumn 跨越 rowSpan 行和 columnSpan 列。小部件将具有给定的 对齐。

    如果 rowSpan 和/或 columnSpan 为 -1,则小部件将扩展到 分别是底部和/或右边缘。

    例子:

    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_())
    

    【讨论】:

    • 非常好。 (尽管由于公司安全政策我看不到快照) 出于好奇:3 列的网格不也可以吗? (我的意思是:标签“2”跨越 2 列,标签“4”跨越 1 列。)
    • 根据题主提供的图表,观察到标签1的权重必须低于标签2、标签3和标签4; label3 与标签 4 具有相同的权重,因此一种解决方案是标签具有以下权重:label1 = 1label2 = 3label3 = 2label4 = 3
    • 好的,我明白了。唔。是否有可能使用权重之类的东西进行布局? (我大致记得这一点,因为这是我在切换到 Qt 之前使用的 GtkTable 区别。)
    • Qt没有直接实现权重,另外一种选择是使用strech函数,查看我的另一个答案:*.com/questions/47681774/…