Pregunta

quisiera llenar un QGridLayout con QWidgets.El QWidgets debe aparecer de arriba a la izquierda a arriba a la derecha y proceder a llenar hacia abajo después de que cada fila se llene con QWidgets.Un ejemplo de una GUI similar y familiar es cómo Apple ordena sus aplicaciones en la pantalla de inicio del iPhone o iPad.Las aplicaciones van de arriba a la izquierda a arriba a la derecha y continúan hacia abajo después de completar cada fila.

En este momento, cada vez que agrego elementos, ocupan toda la pantalla y/o no se agregan uno al lado del otro.

Este es un código de ejemplo de lo que estoy haciendo.

m_gridLayout = new QGridLayout(this);
this->setLayout(m_gridLayout);
m_gridLayout->addWidget(widgetToBeAdded, m_currentRow, m_currentColumn, Qt::AlignLeft);

Procedo a actualizar m_currentColumn y m_currentRow como se esperaba.Después de una cierta cantidad de columnas, le digo que cambie a la siguiente fila y no sucede nada.He confirmado mediante depuración que, de hecho, está generando las filas y columnas correctas).

Al final tendré que ponerme un QScrollArea para que uno pueda desplazarse hacia abajo en la cuadrícula.

El tamaño de cada QWidget será lo mismo.Si pudiera obtener ayuda con respecto a ordenar la cuadrícula correctamente, lo agradecería mucho.

EDITAR:Usando la respuesta a continuación, logré ordenar mis artículos en el orden correcto.Sin embargo, hay una gran cantidad de espacio entre todos los elementos en dirección vertical.Esto no se soluciona cambiando la propiedad verticalSpacing, como yo pensaría.¿Alguien sabe cómo proceder?

¿Fue útil?

Solución

Escribe tu propio diseño de cuadrícula, algo como esto:

Encabezamiento

#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

Fuente

#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 );
}

Prueba en una ventana principal

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

}

Resultado
enter image description here

Si bien ya hay un elemento en una posición determinada, cambie a la siguiente posición en el diseño de la cuadrícula, que tiene un número máximo de columnas de 4 en mi ejemplo.Simplemente cambio a la siguiente columna hasta llegar a la cuarta columna.Luego restablezco la columna a 0 y cambio a la siguiente fila.Hago esto siempre que ya haya un artículo.Tan pronto como no hay ningún elemento en ese lugar, coloco mi widget allí.

Este es sólo un ejemplo rápido, pero tal vez sea suficiente para trabajar con él.

Deberías mejorarlo mediante el manejo de errores, tener cuidado con los bucles sin fin y demás...

Otros consejos

El FlowLayout de este ejemplo de Qt puede ser lo que estás buscando.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top