2012-03-11 3 views
6

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

EDIT: Используя приведенный ниже ответ, мне удалось получить мои товары для сортировки в правильном порядке. Однако между всеми элементами в вертикальном направлении имеется большое пространство. Это не устраняется изменением свойства 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); 
} 

Test в главном окне

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

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

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

Смежные вопросы