我想用QGridLayout
填充QWidgets
。 QWidgets
需要以左上角到右上角的方式显示,并在每行填充QWidgets
后继续向下填充。类似且熟悉的GUI的一个例子是Apple如何在iPhone或iPad的主屏幕上对其应用程序进行排序。应用程序从左上角到右上角,并在每行填充后继续向下。
现在,每当我添加元素时,它们会占据整个屏幕和/或不会彼此相邻添加。
这是我正在做的示例代码
m_gridLayout = new QGridLayout(this);
this->setLayout(m_gridLayout);
m_gridLayout->addWidget(widgetToBeAdded, m_currentRow, m_currentColumn, Qt::AlignLeft);
我按预期继续更新m_currentColumn和m_currentRow。在一定数量的列之后,我告诉它改为下一行,没有任何反应。我已通过调试确认它实际上正在吐出正确的行和列。)
最终,我需要抛出一个QScrollArea
,以便可以向下滚动网格。
每个QWidget
的大小都是相同的。如果我能够在正确分类网格方面获得任何帮助,我们将不胜感激。
编辑:使用下面的答案,我设法让我的项目按正确的顺序排序。但是,在垂直方向上的所有元素之间存在大量空间。正如我想的那样,改变verticalSpacing属性并不能避免这种情况。有谁知道怎么办?
答案 0 :(得分:5)
编写自己的网格布局,如下所示:
标题强>
#ifndef MY_GRID_LAYOUT_H
#define MY_GRID_LAYOUT_H
#include <QGridLayout>
class my_grid_layout : public QGridLayout
{
public:
my_grid_layout(QWidget *parent, int max_column_count );
~my_grid_layout();
void add_widget( QWidget* p_widget );
private:
int m_max_column_count;
};
#endif // MY_GRID_LAYOUT_H
<强>来源
#include "my_grid_layout.h"
my_grid_layout::my_grid_layout(QWidget *parent, int max_column_count)
: QGridLayout(parent)
{
m_max_column_count = max_column_count;
}
my_grid_layout::~my_grid_layout()
{
}
void my_grid_layout::add_widget( QWidget* p_widget )
{
int current_row = 0;
int current_column = 0;
while( itemAtPosition(current_row, current_column) != 0 )
{
if( current_column == (m_max_column_count-1) )
{
current_column = 0;
++current_row;
}
else
{
++current_column;
}
}
QGridLayout::addWidget( p_widget, current_row, current_column );
}
在主窗口中测试
#include "test_1.h"
Test_1::Test_1(QWidget *parent, Qt::WFlags flags)
: QMainWindow(parent, flags)
{
m_grid_layout = new my_grid_layout(this,4);
m_grid_layout->add_widget( new QPushButton( "Widget 0", this ) );
m_grid_layout->add_widget( new QPushButton( "Widget 1", this ) );
m_grid_layout->add_widget( new QPushButton( "Widget 2", this ) );
m_grid_layout->add_widget( new QPushButton( "Widget 3", this ) );
m_grid_layout->add_widget( new QPushButton( "Widget 4", this ) );
m_grid_layout->add_widget( new QPushButton( "Widget 5", this ) );
m_grid_layout->add_widget( new QPushButton( "Widget 6", this ) );
m_grid_layout->add_widget( new QPushButton( "Widget 7", this ) );
m_grid_layout->add_widget( new QPushButton( "Widget 8", this ) );
m_grid_layout->add_widget( new QPushButton( "Widget 9", this ) );
m_grid_layout->add_widget( new QPushButton( "Widget 10", this ) );
m_grid_layout->add_widget( new QPushButton( "Widget 11", this ) );
m_grid_layout->add_widget( new QPushButton( "Widget 12", this ) );
m_grid_layout->add_widget( new QPushButton( "Widget 13", this ) );
QWidget* central_widget = new QWidget(this);
central_widget->setLayout(m_grid_layout);
setCentralWidget(central_widget);
}
Test_1::~Test_1()
{
}
<强>结果强>
虽然某个位置已有项目,但切换到网格布局中的下一个位置,在我的示例中最大列数为4。我只是切换到下一栏,直到我到达第4列。然后我将列重置为0并切换到下一行。只要已有物品,我就这样做。只要那个地方没有物品,我就把我的小部件放在那里。
这只是一个简单的例子,但也许这对你来说已经足够了。
你应该通过错误处理来增强它,注意无限循环等......
答案 1 :(得分:3)
FlowLayout from this Qt example可能正是您要找的。 p>