QGridLayout разная ширина столбца

Я пытаюсь создать такой макет:

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

По сути, я хочу, чтобы ячейка номер 1 в первой строке была тоньше ячейки 2, но ячейки номер 3 и 4 во второй строке должны иметь одинаковую ширину.

Можно ли вообще создать подобный макет с помощью QGridLayout в PyQt4?


person hoan    schedule 20.12.2017    source источник


Ответы (1)


Задача QGridLayout - создать такую ​​структуру, для этого вы должны использовать функцию:

void QGridLayout :: addWidget (QWidget * widget, int fromRow, int fromColumn, int rowSpan, int columnSpan, Qt :: Alignment 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_())

введите описание изображения здесь

person eyllanesc    schedule 20.12.2017
comment
Очень хорошо. (хотя я не мог увидеть снимок из-за политики безопасности компании) Из любопытства: не подойдет ли сетка с 3 столбцами? (Я имею в виду: метка 2 охватывает 2 столбца, метка 4 охватывает 1 столбец.) - person Scheff's Cat; 21.12.2017
comment
Согласно схеме, предоставленной автором вопроса, видно, что этикетка 1 должна иметь меньший вес, чем этикетка 2, этикетка 3 и этикетка 4; label3 имеет тот же вес, что и label 4, поэтому одно из решений состоит в том, чтобы метки имели следующие веса: label1 = 1, label2 = 3, label3 = 2 и label4 = 3 - person eyllanesc; 21.12.2017
comment
Да я вижу. Хм. Разве не было возможности использовать что-то вроде весов для разметки? (Я помню это примерно, поскольку это отличие от GtkTable, которое я использовал до того, как переключился на Qt.) - person Scheff's Cat; 21.12.2017
comment
Qt не реализует веса напрямую, другой вариант - использовать функции strech, проверьте другой мой ответ: stackoverflow.com/questions/47681774/ - person eyllanesc; 21.12.2017