2012-03-11 15 views
6

Chciałbym wypełnić QGridLayout z QWidgets. Numer QWidgets musi się pojawić w lewym górnym i prawym górnym rogu, a po wypełnieniu każdego wiersza QWidgets należy wypełnić go w dół. Przykładem podobnego i znajomego GUI jest to, jak Apple sortuje swoje aplikacje na ekranie głównym iPhone'a lub iPada. Aplikacje przechodzą od lewej do góry w prawym górnym rogu i przechodzą w dół po wypełnieniu każdego wiersza.Jak wypełnić wiersz QGridLayout od lewej do prawej?

W tej chwili, gdy dodaję elementy, zajmują one cały ekran i/lub nie są dodawane obok siebie.

To jest przykład kodu, co robię

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

mogę przystąpić do aktualizacji m_currentColumn i m_currentRow jak oczekiwano. Po pewnej liczbie kolumn mówię, żeby przejść do następnego wiersza i nic się nie dzieje. Potwierdziłem przez debugowanie, że to faktycznie wypluwa właściwe wiersze i kolumny.)

W końcu będę musiał rzucić QScrollArea, aby można było przewinąć w dół.

Wielkość każdego z QWidget będzie taka sama. Jeśli mógłbym uzyskać pomoc dotyczącą prawidłowego sortowania sieci, byłoby to bardzo cenne.

EDYCJA: Korzystając z poniższej odpowiedzi, udało mi się posortować moje produkty w prawidłowej kolejności. Jednak pomiędzy wszystkimi elementami w kierunku pionowym występuje duża przestrzeń. Nie można tego uniknąć, zmieniając właściwość verticalSpacing, jak sądzę. Czy ktoś wie, jak postępować?

Odpowiedz

5

Napisz siatki układ, coś takiego:

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 

Źródło

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

testu w oknie głównym

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

} 

Wynik
enter image description here

Choć istnieje już element w pewnej pozycji, przejdź do następnej pozycji w układzie siatki, która ma maksymalną liczbę kolumn z 4 w moim przykładzie. Właśnie przechodzę do następnej kolumny, aż dotarłem do czwartej kolumny. Następnie resetuję kolumnę do 0 i przełączam do następnego wiersza. Robię to tak długo, jak już istnieje przedmiot. Jak tylko nie ma w tym miejscu żadnego przedmiotu, umieszczam tam widżet.

To tylko szybki przykład, ale może wystarczy, abyś z nim pracował.

Powinieneś poprawić go poprzez obsługę błędów, uważaj na nieskończoną pętlę i takie ...

Powiązane problemy