Domanda

Vorrei riempire un QGridLayout con QWidgets. Il QWidgets deve apparire in modo in alto a sinistra in alto a destra e procedere per riempire il basso verso il basso dopo che ogni riga è riempita con QWidgets. Un esempio di GUI simile e familiare è come Apple ordina le sue app sulla schermata Home di iPhone o iPad. Le app vanno in alto a sinistra in alto a destra e procedere per andare verso il basso dopo che ogni riga è riempita.

In questo momento, ogni volta che aggiungo elementi, occupano la totalità dello schermo e / o non vengono aggiunti uno accanto all'altro.

Questo è il codice di esempio di ciò che sto facendo

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

I Procedo per aggiornare M_CurrentColumn e M_CurrenTenTenTrenTenTrow come previsto. Dopo una certa quantità di colonne, lo dico di passare alla riga successiva e non succede nulla. Ho confermato attraverso il debug che è infatti sputando le righe e le colonne corrette.)

Alla fine, avrò bisogno di lanciare un QScrollArea in modo che si possa scorrere verso il basso la griglia.

La dimensione di ciascun QWidget sarà la stessa. Se potessi ottenere un aiuto per quanto riguarda la classificazione della griglia correttamente, sarebbe molto apprezzato.

Modifica: usando la risposta qui sotto, sono riuscito a ottenere i miei articoli per ordinare nell'ordine corretto. Tuttavia, c'è una grande quantità di spazio tra tutti gli elementi nella direzione verticale. Questo non è ovviato cambiando la proprietà verticale, come penserei. Qualcuno sa come procedere?

È stato utile?

Soluzione

Scrivi il tuo layout della griglia, qualcosa del genere:

intestazione

#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
.

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 una finestra principale

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

}
.

Risultato
Inserisci Descrizione dell'immagine qui

Mentre c'è già un elemento in una determinata posizione, passare alla posizione successiva nel layout della griglia, che ha un numero massimo di colonna di 4 nel mio esempio.Passo solo alla colonna successiva fino a quando ho raggiunto la quarta colonna.Quindi ripristino la colonna su 0 e passa alla riga successiva.Lo faccio finché c'è già un oggetto.Non appena non ci sono oggetti in quel posto, ho messo il mio widget lì.

Questo è solo un rapido esempio, ma forse è abbastanza per te lavorare con.

Dovresti migliorarlo con la gestione degli errori, attenzione per il ciclo infinito e tali ...

Altri suggerimenti

The Flowlayout da questo esempio Qt potrebbe essereCosa stai cercando.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top