2016-12-26 6 views
1

私はいくつかのQtプログラミング(C++)を学び、UI関連のものはすべてC#からWPF/MVVMを使用しています。問題は、自分の選択の背後にある推論プロセスを切り替える際に問題が発生していることです。C#/ WPFからC++/Qtへの遷移:ボタンリストをdinamically生成

私がしようとしているのは、List(またはVectorやObservableCollection)のオブジェクトをButtonのリストにリンクして、UIがリスト内の各要素のボタンを表示するようにすることです。

2つの変数(およびget/setメソッド、またはC#で呼び出される「プロパティ」)を持つCustomerクラス(C#では私のモデルになります)があります:名前とタイプ。各ボタンには対応する名前が表示され、クリックはコールを処理するメソッドにタイプを送信します。

最近、私はVSを持つマシンにアクセスすることはできませんが、C#ではViewとViewModel(コントローラ)を作成するなどの作業を行います。 VMでは、ObservableCollectionを作成してRaisePropertyChangedイベントを発生させ、Viewで、ObservableCollectionにバインドされたItemsControlをDataTemplateボタンとして作成します。ボタンのContentプロパティはCustomerのNameにバインドされ、CommandParameter(Clickイベントで送信されるパラメータ)にはModel自体またはCustomer Typeが設定され、その値に基づいてさまざまな選択が行われます。このようにObservableCollectionを変更すると、表示されるボタンの数が変更されます。

私の問題は、Qtで同じことをする方法です:私が思いついた最高のは、このCustomerクラスのベクトルを作成し、サイクルのためにすることです:

for (unsigned int i = 0; i < model_vector.size(); ++i) 
{ 
    QPushButton* btn = new QPushButton(this); 
    btn->setText(model_vector[i].Name); 
    ui->verticalLayout->addWidget(btn); 

    connect(btn, SIGNAL (released()),this, SLOT (handleButton(model_vector[i]))); 

    btn->show(); 
} 

私はverticalLayoutをクリアしますので、model_vectorを更新するために呼び出されるメソッドで、このサイクルを入れてしまうと、その時点でベクトルに含まれているすべてのボタンを再追加します。

これは実際のモデル/ビューのアプローチ(Qtのドキュメントを読んだ意味では)とは思えませんが、Qtの動作を誤解しているかもしれません。

私は正しいことをしているのですか、それとも良い方法がありますか?

ありがとう!

答えて

0

あなたの元のアプローチは、QtQuickベースのUIの場合とまったく同じように思えます。

モデルはデータを提供しますが、QtQuick ListView(または同様のもの)は、一般的な表示機能を提供し、モデルと実際のエントリの視覚化(代理人)を仲介します。 この場合のデリゲートはボタンになります。

+0

お返事ありがとうございます。それはおそらくOTの質問ですが、私は古典的なQtやQtの学習を開始することをお勧めしますか?もう1つは他よりも使用されていますか? – Marco

+0

どちらのテクノロジも広く使用されていますが、ユースケースによっては好みがあります。 プログラムが従来のデスクトップアプリケーション、マウス/キーボード駆動、フォームとダイアログなどで、ターゲットプラットフォームでネイティブに感じる必要がある場合、その選択は通常QtWidgetsです。 タッチスクリーンベースのデバイス(モバイルまたは埋め込み)、またはエフェクト(アニメーション、フェードイン/フェードアウトなど)、高度なカスタムUI(メディアプレーヤーと考える)が必要な場合は、 QtQuick。 私はそれぞれの他の組み合わせを見たことがありますが、それはあまり一般的ではありません –

+0

偉大な、清算のおかげで! – Marco

関連する問題