QGridLayout,3个窗格,没有正确扩展

时间:2011-10-13 18:33:24

标签: qt qgridlayout qlayout

我正在尝试使用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 个答案:

答案 0 :(得分:8)

查看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);

因此,您已经明确告诉网格布局您希望窗口小部件分别对齐其单元格的左侧,中间,右侧和左侧。在您的情况下,您可能希望使用默认对齐方式,允许窗口小部件填充单元格并遵循各自的大小策略。

答案 1 :(得分:4)

这应该只是在您的小部件上设置适当的大小策略。所以左边和右边的按钮:

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

和中间按钮

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

其中第一个参数定义水平大小策略,第二个参数定义垂直大小策略。

See the size policy documentation as well

答案 2 :(得分:2)

这里有很多变量(不同的小部件,小部件的不同大小策略以及处理布局本身的大小策略,所以要知道出错的地方有点困难。有几点建议:

1)首先尝试使用一种类型的小部件来完成您想要的任务。例如,所有QLabel都具有所有扩展大小策略。 2)只调整小部件的大小策略,我发现在网格布局中添加内容会让事情变得混乱。窗口小部件大小策略的伸展因子应该可以正常工作。 3)不要害怕尝试不同的伸展因子比率。

我发现这是Qt Designer(Creator)帮助解决这些问题的一个方面。在Designer中调整内容并调整运行编译周期的速度要快得多。解决了那里的问题后,您可以获取找到的属性并将其放入代码中,而不是编辑,编译,运行。