我正在用 C++ Qt 4.6.3 开发一个小游戏,我偶然发现了一个布局问题。我正在寻找的布局是一个 3x3 QGridLayout,其中中央单元 (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 vs 4.8)。在调用该setRowMininmumHeight()
方法时,似乎发出了另一个 resize-event,导致递归调用!我希望我的应用程序可以在两个平台上运行,所以很明显我必须找到另一个解决方案。我摆弄了一下setRowStretch()
,setColStretch()
但这些都没有达到预期的结果。我尝试了各种组合,但现在我很困惑......
有没有人能解决这个看似简单的问题?