2017-03-27 63 views
0

我想要做一個列表,當用戶更改一個spinbox的值時,它會更改它的字段編號。 事情是這樣的:如何切換網格佈局中的窗口小部件可見性?

第5場默認

然後,例如,僅有1場

而且,如果用戶想要再次改變它,他可以再放5個領域。

我做了一個GridLayout和一個QList,一個用於標籤,另一個用於LineEdits。我這樣做:

我創建了一個基本的情況下(只有1場)和我在以後添加更多的excecution時間將小工具添加到網格佈局:

gridLayout->addWidget(labels.at(x), 0, 1) 

,其中標籤是QList作。它可以很好地添加小部件,但我無法刪除並再次添加。

我嘗試使用

gridLayout->removeWidget(lables.at(x), 0, 1) 
labels.at(x)->hide() 
label.at(x)->setVisible(false) 

所有的作品,但我不能沒有這再次顯示:

gridLayout->addWidget(labels.at(x), 0, 1) 
labels.at(x)->show() 
label.at(x)->setVisible(true) 

回答

0

佈局是小部件的幾何形狀的處理程序。如果您使用removeWidget()函數,則只會從佈局中刪除該元素,但它仍然可見。如果你不想看到它,你必須用delete刪除它。

在以下示例中,我將向您展示如何使用QSpinBoxvalueChanged信號添加和刪除小部件。

void Dialog::on_spinBox_valueChanged(int arg1) 
{ 

    int nElements = labels.count(); 

    //add 
    if(arg1 > nElements){ 
     for(int i=nElements; i < arg1; i++){ 
      QLabel *label = new QLabel(QString::number(i), this); 
      QLineEdit *line = new QLineEdit(QString::number(i), this); 
      labels.append(label); 
      lines.append(line); 
      ui->gridLayout->addWidget(label, i, 0, 1, 1); 
      ui->gridLayout->addWidget(line, i, 1, 1, 1); 
     } 
    } 

    //remove 
    else if(arg1 < nElements){ 
     for(int i=arg1; i < nElements; i++){ 
      QLabel *label = labels.at(i); 
      QLineEdit *line = lines.at(i); 
      ui->gridLayout->removeWidget(label); 
      ui->gridLayout->removeWidget(line); 
      labels.removeAt(i); 
      lines.removeAt(i); 
      delete label; 
      delete line; 
     } 
    } 
} 

地址:

enter image description here

刪除:

enter image description here

+0

感謝,它的工作原理,但爲什麼我不能只調用setVisible(假的),後來調用setVisible(真) ? 修改Qlist的預定義值從1到5(這就是spinbox的範圍)。 – JavScars

相關問題