Write your own grid layout, for example:
Headline
#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
A source
#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 in the main window
#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() { }
Result
While there is already an element at a certain position, switch to the next position in the grid layout, which in my example has the maximum number of columns 4. I simply switch to the next column until I reach the fourth column. Then I reset the column to 0 and switch to the next row. I do this while there is an item. As soon as there is no element in this place, I placed my widget there.
This is just a quick example, but maybe you just need to work with it.
You have to improve it by handling errors, keep track of an infinite loop, etc.