2012-03-11 27 views
6

मैं QWidgets के साथ QGridLayout भरना चाहता हूं। QWidgets को शीर्ष-बाएं से ऊपर-दाएं फैशन में दिखाई देने की आवश्यकता है और QWidgets से प्रत्येक पंक्ति भरने के बाद नीचे नीचे भरने की आवश्यकता है। एक समान और परिचित जीयूआई का एक उदाहरण यह है कि ऐप्पल आईफोन या आईपैड की होम स्क्रीन पर अपने ऐप्स कैसे टाइप करता है। ऐप्स शीर्ष-बाएं से ऊपर-दाएं जाते हैं और प्रत्येक पंक्ति भरने के बाद नीचे जाने के लिए आगे बढ़ते हैं।कोई 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 का आकार समान होगा। अगर मुझे ग्रिड को व्यवस्थित करने के संबंध में कोई मदद मिल सकती है, तो इसकी सराहना की जाएगी।

संपादित करें: नीचे दिए गए उत्तर का उपयोग करके, मैंने अपने आइटम को सही क्रम में क्रमबद्ध करने में कामयाब रहा है। हालांकि, ऊर्ध्वाधर दिशा में सभी तत्वों के बीच एक बड़ी मात्रा में जगह है। वर्टिकल स्पेसिंग संपत्ति को बदलकर यह obviated नहीं है, जैसा कि मुझे लगता है। क्या कोई जानता है कि कैसे आगे बढ़ना है?

उत्तर

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 की एक अधिकतम स्तंभ संख्या है ग्रिड लेआउट में अगले स्थिति, करने के लिए स्विच है। जब तक मैं 4 वें कॉलम तक नहीं पहुंच जाता तब तक मैं बस अगले कॉलम पर स्विच करता हूं। फिर मैंने कॉलम को 0 पर रीसेट कर दिया और अगली पंक्ति पर स्विच किया। मैं तब तक ऐसा करता हूं जब तक कि पहले से ही कोई आइटम है। जैसे ही उस जगह में कोई वस्तु नहीं है, मैंने अपना विजेट वहां रखा।

यह सिर्फ एक त्वरित उदाहरण है, लेकिन शायद आपके साथ काम करने के लिए यह पर्याप्त है।

आपको इसे त्रुटि प्रबंधन द्वारा बढ़ाया जाना चाहिए, अंतहीन पाश के लिए देखें और ऐसे ...