2012-03-11 193 views
6

我想填写QGridLayoutQWidgetsQWidgets需要以左上角到右上角的方式出现,并在每行填充QWidgets后继续向下填充。类似和熟悉的图形用户界面的一个例子是苹果公司如何在iPhone或iPad的主屏幕上对其应用程序进行排序。应用程序从左上角到右上角,在每行填满后继续向下。如何从左上角向右侧填充QGridLayout?

现在,无论何时添加元素,它们占据整个屏幕和/或不会彼此相邻。

这是我在做什么

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属性并不能避免这种情况。有谁知道如何继续?

回答

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() 
{ 

} 

结果
enter image description here

虽然已经有在特定位置处的项目,切换到在网格布局中的下一个位置,这在我的示例为4的最大列计数。我只是切换到下一列,直到我到达第四列。然后我将列重置为0并切换到下一行。只要已经有一个项目,我会这样做。只要那个地方没有物品,我就把我的小部件放在那里。

这只是一个简单的例子,但也许它足以让您使用。

你应该通过错误处理来加强它,小心无尽的循环等......

相关问题