2017-04-07 54 views
-2

我有一個QDialog,我用Qt Designer設計圖形化。它有一些QComboBox,我想在設計時放置一些佔位符文本,然後在運行時加載實際內容。如何在運行時指定QComboBox項目?

當然,我可以讓QComboBox得到創建,然後調用clear(),addItem()來覆蓋列表。但是如果這個QComboBox出現在幾個地方呢?什麼是保持乾爽的最佳方式?

我認爲合乎邏輯的方法是繼承QComboBox並在構造函數中設置內容,並將Qt Designer中的窗口小部件提升爲我的子類。不幸的是,uic調用構造函數很好,但之後不久調用retranslateUi(),它用設計時間條目替換內容。

我喜歡子類的想法,因爲它也允許我在更改組合框選擇時抽象行爲,但我看不到一種方法來確保我的動態內容生效。

舉例子類構造函數:由UIC生產

Sub_QComboBox::Sub_QComboBox(QWidget * parent) : QComboBox(parent) 
{ 
    QStringList entries = getEntryList(); 
    clear(); 
    for(int i=0; i<entries.size(); ++i) 
     addItem(entries[i], getDataForEntry(i)); 
} 

所得ui_dialog.h:

void setupUi(QDialog *Dialog) 
{ 
    //<snip> 

    cbxMyComboBox = new Sub_QComboBox(parent); 

    //<snip> 

    retranslateUi(Dialog); 

    QMetaObject::connectSlotsByName(Dialog); 
} // setupUi 

void retranslateUi(QDialog *Dialog) 
{ 
    //<snip> 

    cbxLanguage->clear(); 
    cbxLanguage->insertItems(0, QStringList() 
    //design time contents 
    ); 

    //<snip> 

} // retranslateUi 

回答

-2

我最終使用的解決方案如下。我決定,當內置的一個很好時,不需要使用自定義模型。

首先,含量人口移出的構造,併成爲一個專門的公共方法:

void Sub_QComboBox::populateContents(void) 
{ 
    QStringList entries = getEntryList(); 
    clear(); 
    for(int i=0; i<entries.size(); ++i) 
     addItem(entries[i], getDataForEntry(i)); 
} 

然後,我打電話,在我的對話框的構造函數:

Dialog::Dialog(QWidget *parent) : QDialog(parent) 
{ 
    ui.setupUi(this); 
    ui.mySub_QComboBox->populateContents(); 
} 

最後,也可以從對話框的changeEvent中調用它,無論如何需要執行以捕捉語言更改:

void Dialog::changeEvent(QEvent *e) 
{ 
    QDialog::changeEvent(e); 
    switch (e->type()) 
    { 
     case QEvent::LanguageChange: 
      ui.retranslateUi(this); //can't believe we have to do this manually for every QWidget subclass we write... 
      ui.mySub_QComboBox->populateContents(); 
      break; 
     default: 
      break; 
    } 
} 

完成!因此,我可以將任何我喜歡的東西放在Qt Designer中,因此對於截圖/演示看起來不錯,但是在運行時,內容會在構建時設置一次,如果語言發生更改,則會再次設置內容。

+0

ouch,2以最佳解決我的問題的方式回答我自己的問題。很想知道我在這裏做錯了什麼。 –

1

您可以使用型號QComboBox,這樣的方式,只要你想改變ComboBox的內容您只需更新模型,組合框的其餘部分將自動更新。

它有一些QComboBox,我想放一些佔位符文本在 設計時

QComboBox沒有一個佔位符選項,所以你需要有一個編輯ComboBox和使用這樣的:

myCombo->lineEdit()->setPlaceholderText("Some text"); 

負荷運行時

實際內容

要動態加載內容,您可以使用模型。

itemModel = new QStringListModel(this); 
comboBox1->setModel(itemModel); 
comboBox2->setModel(itemModel); 
+0

我擔心模型可能會被建議。我不確定編寫一個自定義模型是否值得付出努力,因爲該列表在初始化時只設置一次(不包括翻譯),因此每行都有一個QString/QVariant對。 –

+0

在模型中,您只需要在一個位置設置組合框的內容,並且它將同時反映在所有組合框中。 否則,您需要爲您提到的多個組合設置相同的內容。 – Avi

+0

我想你已經誤解了我。我已經子類化QComboBox。人口在每個實例的構造函數中發生一次。那裏沒有問題。問題是隨後被覆蓋。我瞭解模型的作用。我仍然需要一個自定義派生。也許我誤用了「佔位符」 - 我的意思是QComboBox的設計時間內容。 –