【发布时间】:2015-08-27 00:47:04
【问题描述】:
得到如下安排(原here):
五个非常规大小的按钮(w:400,h:300),它们的排列方式如下:四个方形模式(两个在顶部,两个在底部),紧密结合在一起,第五个按钮在中间,与其他四个按钮的交集重叠。我想知道在展开、最大化和/或最小化窗口时是否可以使用任何布局(网格布局、表单布局等)来保持这种排列?感谢您的帮助。
【问题讨论】:
标签: qt qlayout qgridlayout
得到如下安排(原here):
五个非常规大小的按钮(w:400,h:300),它们的排列方式如下:四个方形模式(两个在顶部,两个在底部),紧密结合在一起,第五个按钮在中间,与其他四个按钮的交集重叠。我想知道在展开、最大化和/或最小化窗口时是否可以使用任何布局(网格布局、表单布局等)来保持这种排列?感谢您的帮助。
【问题讨论】:
标签: qt qlayout qgridlayout
使用 QGridLayout,大小为 4x4。然后让每个按钮使用 2x2 网格布局单元格,您可以使用右边的QGridLayout::addWidget() overload。有给columnSpan和rowSpan的2个。
【讨论】:
(听起来像是一道作业题。)
我的第一种方法是在设置网格布局后将第二个小部件作为第一个小部件的父级。然后你必须让第二个小部件与第一个一起调整大小。我在过去使用pop up dialogs in iOS 完成了这项工作。
@hyde 的解决方案更优雅地解决了这个问题。我把所有东西都放在了堆上,但是对于这样一个简单的应用程序,所有东西都可以放在堆栈上(QWidget * w = new QWidget(); => QWidget w;)。
#include <QApplication>
#include <QWidget>
#include <QGridLayout>
#include <QPushButton>
#include <QList>
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
QWidget * w = new QWidget();
QGridLayout * grid = new QGridLayout();
QList <QPushButton *> buttons;
for(int i = 0; i< 5; i++)
{
buttons.append(new QPushButton("Button "+ QString::number(i+1)));
buttons.last()->setFixedSize(400, 300);
}
grid->addWidget(buttons.at(0),0,0,2,2);// upper left
grid->addWidget(buttons.at(1),0,2,2,2);// upper right
grid->addWidget(buttons.at(2),2,0,2,2);// lower left
grid->addWidget(buttons.at(3),2,2,2,2);// lower right
grid->addWidget(buttons.at(4),1,1,2,2);// centered
w->setLayout(grid);
w->show();
return a.exec();
}
如果您希望网格元素在调整网格大小时保持居中且没有间隙,请确保在外部添加缓冲行/列,并为它们设置拉伸值。就像在这个example.
希望对您有所帮助。
【讨论】: