2012-03-11 71 views
6

我想填寫QGridLayoutQWidgetsQWidgets需要以左上角到右上角的方式出現,並在每行填充QWidgets後繼續向下填充。類似和熟悉的圖形用戶界面的一個例子是蘋果公司如何在iPhone或iPad的主屏幕上對其應用程序進行排序。應用程序從左上角到右上角,在每行填滿後繼續向下。如何從左上角向右側填充QGridLayout?

現在,無論何時添加元素,它們佔據整個屏幕和/或不會彼此相鄰。

這是我在做什麼

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

我繼續如預期般更新m_currentColumn和m_currentRow示例代碼。在一定數量的列後,我告訴它改變到下一行,沒有任何反應。我已通過調試確認它實際上吐出了正確的行和列)。

最後,我需要拋出一個QScrollArea,以便可以向下滾動網格。

每個QWidget的大小將是相同的。如果我可以得到任何關於正確排序網格的幫助,將不勝感激。

編輯:使用下面的答案,我設法讓我的項目按正確的順序排序。但是,垂直方向上的所有元素之間都有很大的空間。正如我所想的那樣,通過更改verticalSpacing屬性並不能避免這種情況。有誰知道如何繼續?

回答

5

寫自己的網格佈局,像這樣:

#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 

來源

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

測試在主窗口

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

} 

結果
enter image description here

雖然已經有在特定位置處的項目,切換到在網格佈局中的下一個位置,這在我的示例爲4的最大列計數。我只是切換到下一列,直到我到達第四列。然後我將列重置爲0並切換到下一行。只要已經有一個項目,我會這樣做。只要那個地方沒有物品,我就把我的小部件放在那裏。

這只是一個簡單的例子,但也許它足以讓您使用。

你應該通過錯誤處理來加強它,小心無盡的循環等......

相關問題