Как заполнить QGridLayout слева направо? - PullRequest
6 голосов
/ 12 марта 2012

Я хотел бы заполнить QGridLayout с QWidgets. Символ QWidgets должен отображаться сверху вниз слева направо и переходить к заполнению вниз после того, как каждый ряд будет заполнен QWidgets. Пример похожего и знакомого графического интерфейса - это то, как 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, как я думаю. Кто-нибудь знает, как поступить?

Ответы [ 2 ]

5 голосов
/ 12 марта 2012

Напишите свой собственный макет сетки, что-то вроде этого:

Заголовок

#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.Я просто переключаюсь на следующий столбец, пока не достигну 4-го столбца.Затем я сбрасываю столбец на 0 и переключаюсь на следующую строку.Я делаю это до тех пор, пока уже есть предмет.Как только в этом месте нет элемента, я помещаю туда свой виджет.

Это всего лишь быстрый пример, но, возможно, вам достаточно работать с ним.

Вам следует улучшить егопри обработке ошибок следите за бесконечным циклом и прочим ...

3 голосов
/ 12 марта 2012

FlowLayout из этого примера Qt может быть тем, что вы ищете.

...