Я разрабатываю небольшую игру на С++ 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()
, но ни один из них не дал желаемого результата. Я пробовал всевозможные комбинации, но теперь я совершенно застрял...
У кого-нибудь есть решение этой, казалось бы, простой проблемы?