Настройка QGridLayout 3x3 с центральной ячейкой

Я разрабатываю небольшую игру на С++ Qt 4.6.3 и наткнулся на проблему с макетом. Макет, который я ищу, представляет собой QGridLayout 3x3, центральная ячейка которого (1,1) содержит основной виджет (это настольная игра). Ячейка (0,1) должна содержать QLabel, показывающий, чья сейчас очередь, ячейки (1,0) и (1,2) подразделяются на QVBoxLayouts для хранения максимум 3 табло подсчета очков, а (2,1) -cell также содержит какую-то QLabel.

Изображение макета

Это то, что у меня есть до сих пор:

QGridLayout *mainLayout = new QGridLayout(this);
QVBoxLayout *leftLayout = new QVBoxLayout;
QVBoxLayout *rightLayout = new QVBoxLayout;  
mainLayout->addLayout(leftLayout,   1, 0, AlignTop);
mainLayout->addWidget(topText,      0, 1, AlignCenter);
mainLayout->addWidget(board,        1, 1);
mainLayout->addLayout(bottomText,   2, 1, AlignCenter);
mainLayout->addLayout(rightLayout,  1, 2, AlignTop);

Теперь в MS Windows (ноутбук моего GF) я решил эту проблему, повторно реализовав функцию resizeEvent():

void Game::resizeEvent(QResizeEvent *)
{
    mainLayout->setRowMinimumHeight(1, 0.8 * height());
    mainLayout->setColMinimumWidth(1, 0.8 * height());
    // some other stuff
}

Это сработало отлично! Однако в Unix, похоже, есть проблема (или это может быть связано с разницей версий? 4.6 против 4.8). При вызове метода setRowMininmumHeight() кажется, что выдается другое событие изменения размера, что приводит к рекурсивному вызову! Я хочу, чтобы мое приложение работало на обеих платформах, поэтому, очевидно, мне нужно было найти другое решение. Я возился с setRowStretch() и setColStretch(), но ни один из них не дал желаемого результата. Я пробовал всевозможные комбинации, но теперь я совершенно застрял...

У кого-нибудь есть решение этой, казалось бы, простой проблемы?


person JorenHeit    schedule 31.05.2012    source источник


Ответы (1)


Вы должны использовать растяжки, а не минимальные размеры, чтобы решить проблему. Выполните этот код после добавления виджетов в макет, чтобы назначить 80% высоты средней строке:

mainLayout->setRowStretch(0, 1); // 10% for top row
mainLayout->setRowStretch(1, 8); // 80% for middle row
mainLayout->setRowStretch(2, 1); // 10% for bottom row

Обратите внимание, что ограничения минимального размера содержащихся виджетов по-прежнему соблюдаются (если только вы не установите для политики размера значение «игнорировать»). Итак, если вы хотите назначить всю высоту за вычетом двух минимальных размеров строк 0 и 2 (как вы говорите, они должны быть «как можно меньше»), назначьте 100% средней строке и 0% строкам 0 и 2; они по-прежнему соблюдают минимальные размеры:

mainLayout->setRowMinimumHeight(0, 20); // 20px for top row
mainLayout->setRowMinimumHeight(2, 20); // 20px for bottom row
mainLayout->setRowStretch(0, 0);
mainLayout->setRowStretch(1, 1); // remaining height for middle row
mainLayout->setRowStretch(2, 0);
person leemes    schedule 31.05.2012
comment
Спасибо! Документация никогда не давала мне понять, что растяжки можно использовать таким образом... Я пометил ваш ответ как принятый, но все еще есть одна небольшая проблема. Виджет в ячейке (1,1) выровнен по левому краю, но когда я пытаюсь выровнять его по центру, он исчезает. - person JorenHeit; 31.05.2012
comment
@user1428839 user1428839 Я помню, что QLayout ведет себя странно, когда вы меняете выравнивание виджетов. Я не могу вспомнить, в чем проблема. Но это может иметь какое-то отношение к подсказкам размера внутреннего виджета. Выравнивание имеет смысл только в том случае, если виджет не будет заполнять всю ячейку. Обходным путем было бы позволить виджету заполнить ячейку и выполнить выравнивание внутри вашего виджета самостоятельно. Вы можете попытаться узнать больше о выравнивании QLayout +, так как я не так часто его использую, поэтому мне жаль, что я не могу вам больше помочь. - person leemes; 31.05.2012
comment
А, все равно спасибо! Вы заставили меня понять, что это также может быть связано с внутренней работой Виджета, что действительно имело место! :-) - person JorenHeit; 31.05.2012
comment
@ user1428839 Рад, что смог помочь :) - person leemes; 31.05.2012