2011-06-13 83 views
0

如何在運行時創建QGridLayout並動態生成行併爲其動態添加按鈕?如何在運行時創建QGridLayout並動態生成行?

On button我想要在運行時放置圖像&標籤。

我在按鈕單擊上創建四個按鈕,並嘗試在它上面放置一個圖標,但它沒有出現在上面,我試圖使我的網格可滾動(垂直),但它沒有滾動。

QScrollArea *scrollArea = new QScrollArea(this);   

     QPushButton *b1 = new QPushButton(strsearch); 
     QPushButton *b2 = new QPushButton(strsearch); 
     QPushButton *b3 = new QPushButton(strsearch); 
     QPushButton *b4 = new QPushButton(strsearch); 


     b1->setGeometry(QRect(0, 0, 162, 26)); 
     b2->setGeometry(QRect(0, 0, 162, 26)); 
     b3->setGeometry(QRect(0, 0, 162, 26)); 
     b4->setGeometry(QRect(0, 0, 162, 26)); 
     b1->setIcon(QIcon("user.gif")); 
     b1->setIconSize(QSize(160, 26)); 
     b2->setIcon(QIcon("user.gif")); 
     b2->setIconSize(QSize(160, 26)); 
     b3->setIcon(QIcon("user.gif")); 
     b3->setIconSize(QSize(160, 26)); 
     b4->setIcon(QIcon("user.gif")); 
     b4->setIconSize(QSize(160, 26)); 

     QVBoxLayout *vl = new QVBoxLayout; 

     layout = new QGridLayout; // this is your grid layout 
     vl->addWidget(b1); 
     vl->addWidget(b2); 
     vl->addWidget(b3); 
     vl->addWidget(b4); 

     vl->addLayout(layout); 
     scrollArea->setWidget(vl->widget()); 
     vl->addWidget(scrollArea); 

     setLayout(vl); 

謝謝。

回答

0

在運行時向佈局添加東西沒有什麼特別的。

我建議你創建網格佈局,並將其作爲你想要它顯示的窗口小部件的成員存儲,並將你的按鈕的clicked()信號連接到自定義插槽(如果該窗口部件)。

事情是這樣的:

class Win: public QWidget 
{ 
    Q_OBJECT 

    public: 
     Win(QWidget *parent=0): QWidget(parent) 
    { 
     QPushButton *b1 = new QPushButton("click"); 
     QVBoxLayout *vl = new QVBoxLayout; 
     layout = new QGridLayout; // this is your grid layout 
     vl->addWidget(b1); 
     vl->addLayout(layout);  // added to the widget's main layout 
     setLayout(vl); 
     connect(b1, SIGNAL(clicked()), this, SLOT(clicked())); // connect button to slot 
    } 

    public slots: 
     void clicked() 
     { 
      int position = layout->rowCount(); // this works out as the first row index with nothing on it 
      QPushButton *b = new QPushButton; 
      b->setIcon(<<the icon you want>>); 
      b->setText(<<the text you want>>); 
      layout->addWidget(b, position, 0); 
      layout->addWidget(new QLabel(<<whatever you want here>>), position, 1); 
        ... 
     } 

    private: 
     QGridLayout *layout; 
}; 

沒有什麼能阻止你添加新QGridLayout,並添加新的小工具,它在運行時。在UI上管理可變數量的佈局可能會有點困難。


您的代碼沒有多大的意義。您將按鈕添加到QVBoxLayout,然後添加一個空網格佈局,然後將滾動區域的窗口小部件設置爲不存在的窗口(vl->widget()將返回NULL,因爲QVBoxLayout不是窗口小部件,請參閱here),然後將該滾動區域添加到您試圖包含在滾動區域本身中的佈局中?

您需要適當地嵌套佈局和小部件。

  • 將按鈕添加到網格佈局,如果這是你想要的。
  • 然後爲該佈局創建一個容器小部件(例如一個QFrame),並將該小部件的佈局設置爲您的網格佈局。
  • 然後將QFrame加入QScrollArea
  • 然後把滾動區域添加到您的容器小部件的佈局。

請通過Qt樣本和layout documentation,包括樣本。你需要更多地瞭解佈局。

+0

@Mat:Thanks.But如何放置圖像和拉布勒在運行時按鈕的上方。 – user662285 2011-06-13 09:05:14

+0

只需創建按鈕並設置圖標/文本(更新我的示例代碼以顯示)。沒有什麼特別的要求,請查看[qt教程](http://doc.qt.nokia.com/latest/widgets-tutorial.html),它們向您展示瞭如何創建小部件的基本知識(在運行時)。 – Mat 2011-06-13 09:12:42

+0

@Mat: 我的需求就像我應該創建基於搜索結果的按鈕,它也應該可以滾動。如何使它可以滾動? – user662285 2011-06-13 09:30:44

1

除了靜態(:。

然後加入新的佈局,你應該刪除舊的佈局和小部件後,您需要添加新的佈局和部件

而且不要忘記調用show爲所有小部件和佈局所在的窗體/對話框。

UPD:

b1->show(); 
b2->show(); 
b3->show(); 
b4->show(); 

this->update(); 
this->show();