2017-04-07 15 views
-2

Qt DesignerでグラフィカルにデザインしたQDialogがあります。いくつかのプレースホルダテキストをデザイン時に配置し、実行時に実際の内容をロードしたい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から呼び出すこともできます。これは言語の変更をキャッチするために実装する必要があります。

完了!だから私はQt Designerに好きなものを置くことができるので、スクリーンショットやデモにはいいですが、実行時にはコンテンツが構築時に設定され、言語が変更されると再び設定されます。

+0

私の問題を最適に解決する方法で私自身の質問に答えるために、2つの賛成の投票があった。私がここで間違っていたことを知りたいのは非常に興味があります。 –

1
あなたはコンボボックスの内容を変更したい時はいつでもあなたはそのようにして、QComboBoxでモデルを使用することができます

モデルを更新するだけで、残りのコンボボックスは自動的に更新されます。

それ持っている私はあなたが編集可能なコンボボックスおよび使用を持っている必要がありますので、

QComboBoxは、プレースホルダのオプションがありません 設計時にいくつかのプレースホルダのテキストを入れたいのですが、いくつかのQComboBoxこの:ランタイム

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

負荷が実際の内容

動的にコンテンツを読み込むには、モデルを使用できます。

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

私はモデルが提案される可能性が懸念されました。私は、リストが初期化(変換を除く)時に一度しか設定されていないので、各行に対してQString/QVariantのペアを持つカスタムモデルを書くのは価値があるとは思わない。 –

+0

モデルでは、コンボボックスの内容を1か所で設定するだけで、すべてのコンボボックスに同時に反映されます。 そうでなければ、言及したように複数のコンボのために同じ内容を設定する必要があります。 – Avi

+0

私はあなたが私を誤解したと思います。私はQComboBoxをサブクラス化しました。各インスタンスのコンストラクタでは、その集団は一度発生します。そこに問題はありません。問題はそれが後で上書きされることです。私はモデルが何をするのか理解している。私はまだカスタム派生物が必要です。そしておそらく私は "プレースホルダ"を誤用しました。つまり、私はQComboBoxのデザイン時の内容を意味しました。 –

関連する問題