2012-03-11 14 views
6

Vorrei riempire uno QGridLayout con QWidgets. Il QWidgets deve apparire in alto a sinistra in alto a destra e procedere a riempire il basso verso il basso dopo che ciascuna riga è stata riempita con QWidgets. Un esempio di una GUI simile e familiare è il modo in cui Apple ordina le sue app sulla schermata principale dell'iPhone o dell'iPad. Le app vanno in alto a sinistra in alto a destra e procedono in modo da andare verso il basso dopo che ciascuna riga è stata riempita.Come si riempie un QGridLayout da alto a sinistra a destra?

In questo momento, ogni volta che aggiungo elementi, occupano interamente lo schermo e/o non vengono aggiunti uno accanto all'altro.

Questo è esempio di codice di quello che sto facendo

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

procedo per aggiornare m_currentColumn e m_currentRow come previsto. Dopo una certa quantità di colonne, gli dico di passare alla riga successiva e non succede nulla. Ho confermato tramite debugging che è infatti sputando le righe e le colonne corrette.)

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

La dimensione di ogni QWidget sarà la stessa. Se potessi ricevere qualche aiuto per quanto riguarda la corretta classificazione della griglia, sarebbe molto apprezzato.

MODIFICA: utilizzando la risposta di seguito, sono riuscito a ordinare i miei articoli nell'ordine corretto. Tuttavia, vi è una grande quantità di spazio tra tutti gli elementi nella direzione verticale. Questo non è ovviato cambiando la proprietà verticalSpacing, come direi. Qualcuno sa come procedere?

risposta

5

Scrivi la tua layout a griglia, qualcosa di simile:

Header

#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 

Fonte

#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
enter image description here

Mentre v'è già un elemento in una certa posizione, passare alla successiva posizione nel layout griglia, che ha un numero massimo di colonna 4 nel mio esempio. Passo alla colonna successiva finché non raggiungo la quarta colonna. Quindi reimpostare la colonna su 0 e passare alla riga successiva. Lo faccio finché c'è già un oggetto. Non appena non ci sono oggetti in quel luogo, ho messo il mio widget lì.

Questo è solo un breve esempio, ma forse è sufficiente per voi per lavorare con.

Si dovrebbe migliorare per la gestione degli errori, attenzione per il ciclo infinito e tale ...

Problemi correlati