2012-03-11 9 views
6

Me gustaría llenar un QGridLayout con QWidgets. El QWidgets debe aparecer en la parte superior izquierda a la esquina superior derecha y proceder a llenar el plumón hacia abajo una vez que cada fila se llena con QWidgets. Un ejemplo de GUI similar y familiar es cómo Apple clasifica sus aplicaciones en la pantalla de inicio del iPhone o iPad. Las aplicaciones van de arriba a la izquierda a la esquina superior derecha y continúan hacia abajo una vez que se llena cada fila.¿Cómo se puede completar un QGridLayout desde la parte superior izquierda a la derecha?

Ahora, cada vez que agrego elementos, ocupan la totalidad de la pantalla y/o no se agregan uno al lado del otro.

Este es el código 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 pasa nada. He confirmado a través de la depuración que de hecho está escupiendo las filas y columnas correctas.)

Eventualmente, tendré que lanzar en un QScrollArea para que se pueda desplazar hacia abajo en la cuadrícula.

El tamaño de cada QWidget será el mismo. Si pudiera obtener ayuda con respecto a la clasificación de la cuadrícula correctamente, sería muy apreciado.

EDITAR: Utilizando la respuesta a continuación, he logrado que mis artículos se clasifiquen en el orden correcto. Sin embargo, hay una gran cantidad de espacio entre todos los elementos en la dirección vertical. Esto no se obvia cambiando la propiedad VerticalSpacing, como yo diría. ¿Alguien sabe cómo proceder?

Respuesta

5

Escribe tu propia disposición de la rejilla, algo como esto:

Cabecera

#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 artículo en una determinada posición, cambiar a la siguiente posición en el diseño de la red, que tiene un recuento de columna máxima de 4 en mi ejemplo. Solo cambio a la siguiente columna hasta que llegue a la cuarta columna. Luego reinicié la columna a 0 y cambio a la siguiente fila. Hago esto siempre y cuando ya haya un artículo. Tan pronto como no hay ningún elemento en ese lugar, pongo mi widget allí.

Este es solo un ejemplo rápido, pero tal vez sea suficiente para que usted trabaje con él.

Debe mejorarlo mediante el manejo de errores, tenga cuidado con el bucle infinito y tales ...

Cuestiones relacionadas