QGridLayout, 3 панели, неправильно расширяется - PullRequest
6 голосов
/ 13 октября 2011

Я пытаюсь расположить окно (все в коде) с QGridLayout. Я могу добавить виджеты в макет, и они отображаются в моем окне, но я не могу понять, как правильно их изменить размер. Вот что я хотел бы

[Leftmost][--------Center---------][Rightmost]

Это 3 "окна" моего окна (все три списка). Левый и правый должны иметь статическую ширину и охватывать их соответствующие стороны, а центр должен расширяться, чтобы заполнить ширину по мере того, как окно увеличивается (или сжимается).

Некий код:

// Create the subviews, add them to a grid layout, and set the layout to the window.
QTableView *list = new QTableView(0);
list->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);
QTableView *flashList = new QTableView(0);
flashList->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);

QPushButton *infoButton = new QPushButton("Info!");
QPushButton *flashFeedsButton = new QPushButton("Flashfeeds");

QGridLayout *gridLayout = new QGridLayout;



// Set the minimum widths for all three columns of the grid
gridLayout->setColumnMinimumWidth(GridColumnFirst, 300);
gridLayout->setColumnMinimumWidth(GridColumnSecond, 300);
gridLayout->setColumnMinimumWidth(GridColumnThird, 300);

// Set the minimum heights for all rows of the grid
int headerFooterHeight = 44;
gridLayout->setRowMinimumHeight(GridRowFirst, headerFooterHeight);
gridLayout->setRowMinimumHeight(GridRowSecond, 200);
gridLayout->setRowMinimumHeight(GridRowThird, headerFooterHeight);


// Set the stretch factors
gridLayout->setColumnStretch(GridColumnFirst, 1);
gridLayout->setColumnStretch(GridColumnFirst, 2);
gridLayout->setColumnStretch(GridColumnThird, 1);

gridLayout->addWidget(list, 1, 0, Qt::AlignLeft);
gridLayout->addWidget(flashList, 1, 1, Qt::AlignCenter);
gridLayout->addWidget(infoButton, 0, 3, Qt::AlignRight);
gridLayout->addWidget(flashFeedsButton, 0, 1, Qt::AlignLeft);

_mainWindow->setLayout(gridLayout);

(Как вы могли бы сказать, в конечном итоге это будет сетка 9x9, но суть остаётся, я пытаюсь получить в среднем ряду (GridRowSecond) растянутые столбцы).

Сами ряды просто расширяются. Кажется, проблема в том, что виджеты в каждой ячейке расширяются, чтобы занять место, содержащее их. Как мне это сделать? (также по вертикали мой список расширяется правильно, но не по горизонтали).

Ответы [ 3 ]

8 голосов
/ 13 октября 2011

Посмотрите документы на QGridLayout :: AddWidget :

По умолчанию выравнивание равно 0, что означает, что виджет заполняет всю ячейку.

Но у вас есть следующее:

gridLayout->addWidget(list, 1, 0, Qt::AlignLeft);
gridLayout->addWidget(flashList, 1, 1, Qt::AlignCenter);
gridLayout->addWidget(infoButton, 0, 3, Qt::AlignRight);
gridLayout->addWidget(flashFeedsButton, 0, 1, Qt::AlignLeft);

Таким образом, вы специально указали макету сетки, что хотите, чтобы ваш виджет был выровнен по левому, центральному, правому и левому краям соответственно. В вашем случае вы, вероятно, захотите использовать выравнивание по умолчанию, позволяющее виджетам заполнять ячейки и следовать их собственным соответствующим политикам размера.

4 голосов
/ 13 октября 2011

Нужно просто установить правильную политику размеров для ваших виджетов.Таким образом, кнопки слева и справа:

button->setSizePolicy( QSizePolicy::Fixed, QSizePolicy::Fixed );

и для средней кнопки

button->setSizePolicy( QSizePolicy::Expanding, QSizePolicy::Fixed );

, где первый аргумент определяет политику горизонтального размера, а второй - политику вертикального размера.

См. Также документацию по политике размера

2 голосов
/ 13 октября 2011

У вас здесь много переменных (разные виджеты, политики разных размеров для виджетов и политики размеров, работающие над самим макетом, поэтому немного сложно понять, где что-то идет не так. Пара предложений:

1) Сначала попробуйте выполнить то, что вы хотите, только с одним типом виджета.Например, все QLabels со всеми политиками расширения размера.2) Отрегулируйте только политики размеров виджетов, я обнаружил, что добавление материала в макет сетки начинает сбивать с толку.Коэффициент растяжения для политики размера виджета должен работать нормально.3) Не бойтесь пробовать разные соотношения для факторов растяжения.

Я обнаружил, что это одна из тех вещей, где Qt Designer (Creator) полезен для решения этих проблем.Гораздо быстрее настроить вещи в Designer и изменить размер, чем запустить цикл компиляции.После того, как вы решили проблему там, вы можете взять свойства, которые вы нашли, и поместить их в свой код вместо редактирования, компиляции, запуска.

...