使用中央单元设置3x3 QGridLayout

时间:2012-05-31 16:23:38

标签: c++ qt resize qgridlayout

我正在用C ++ Qt 4.6.3开发一个小游戏,我偶然发现了布局问题。 我正在寻找的布局是一个3x3 QGridLayout,中央单元格(1,1)保存主要小部件(这是一个棋盘游戏)。 (0,1) - 单元格应该保持QLabel显示转动它,(1,0)和(1,2)单元格被细分为QVBoxLayouts以容纳最多3个记分板,并且(2,1) -cell还拥有某种QLabel。

Image of the layout

这是我到目前为止所得到的:

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()方法时,似乎发出了另一个resize-event,导致递归调用!我希望我的应用程序可以在两个平台上运行,所以显然我必须找到另一个解决方案。我摆弄了setRowStretch()setColStretch(),但这些都没有得到理想的结果。我尝试了各种各样的组合,但现在我很困难......

有没有人能解决这个看似简单的问题?

1 个答案:

答案 0 :(得分:3)

您应该使用延伸而不是最小尺寸来解决问题。将小部件添加到布局后执行此代码,将高度的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);