【问题标题】:How does one fill a QGridLayout from top-left to right?如何从左上到右填充 QGridLayout?
【发布时间】:2012-03-28 10:33:36
【问题描述】:

我想用QWidgets 填写QGridLayoutQWidgets 需要以从左上到右上的方式出现,并在每行填充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 属性并不能避免这种情况。有谁知道如何进行?

【问题讨论】:

  • 将布局对齐设置为Qt.AlignTop 通常会减少小部件之间的垂直间距。

标签: qt user-interface qwidget grid-layout qgridlayout


【解决方案1】:

编写自己的网格布局,如下所示:

标题

#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 并切换到下一行。只要已经有一个项目,我就会这样做。一旦那个地方没有物品,我就把我的小部件放在那里。

这只是一个简单的示例,但也许对您来说已经足够了。

你应该通过错误处理来增强它,注意无限循环等等......

【讨论】:

    【解决方案2】:

    FlowLayout from this Qt example 可能就是您要找的。​​p>

    【讨论】:

      猜你喜欢
      • 2015-02-12
      • 1970-01-01
      • 2011-09-25
      • 1970-01-01
      • 2019-03-06
      • 1970-01-01
      • 2021-05-04
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多