6

我正在尝试使用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) 具有弹性列)。

行本身扩展得很好。问题似乎是让每个单元格上的小部件展开以占用它们的包含空间。我该怎么做呢?(另外,我的列表在垂直方向上正确扩展,但不是水平方向)。

4

3 回答 3

9

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

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

于 2011-10-13T19:07:17.717 回答
4

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

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

和中间按钮

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

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

另请参阅尺寸政策文档

于 2011-10-13T18:49:50.063 回答
2

这里有很多变量(不同的小部件,小部件的不同尺寸策略,以及布局本身的尺寸策略,所以很难知道哪里出了问题。一些建议:

1)首先尝试只用一种类型的小部件来完成你想要的。例如,具有所有扩展尺寸策略的所有 QLabel。2)只调整小部件的大小策略,我发现在网格布局中添加东西开始让事情变得混乱。小部件尺寸策略的拉伸因子应该可以正常工作。3) 不要害怕尝试不同的拉伸系数比率。

我发现这是 Qt Designer (Creator) 有助于解决这些问题的原因之一。在 Designer 中调整内容和调整大小比运行编译周期要快得多。在那里解决问题后,您可以获取找到的属性并将其放入代码中,而不是编辑、编译、运行。

于 2011-10-13T18:50:51.007 回答