2017-02-23 7 views
-1

QDialogに10個のQComboBoxがあります。そして、私はDialogを開いている間、これらのコンボボックスにデータを書き込んでいます。コンボボックスにクリックされたスロットがないので、Dialogをロードするのに7秒かかります。私はスレッドを使ってこの問題を解決できると思うが、私はQThreadを知らない。QComboBoxでデータを埋めるためにQDialogのスレッディングを使用するには?

+0

質問を編集して[これまでに試したこと](http://whathaveyoutried.com)を表示してください。問題のあるコードの[mcve]を含める必要があります。次に、特定の問題を解決するために役立つことができます。 [ask]も読んでください。 –

答えて

0

QTではウィジェットがメインスレッド外で修正されることはないため、解決策は簡単ではありません。

単純な解決策: スレッドを使用してデータをQStringListsに配置し、addItemsを使用して設定します。 QThreadPoolはこの用途に使用する方が簡単です。 この問題は、問題が処理ではなくデータ自体のサイズである場合に役立ちません。

複雑なソリューション(学習のための素晴らしい): あなたはしかし、ウィジェット(QAbstractItemModel)のモデルを再実装、およびモデルにQThreadを使用することができます。

また、setVisible(bool)を真に上書きするだけで、setVisibleが初めて呼び出されたときにデータをロードする独自のQListView派生クラスを作成することもできます。 このクラスのインスタンスをsetView()で各コンボボックスに設定します。

QThreadの使い方については、例を参照してください。チュートリアルを読む...ここで説明するのは複雑ですが、ネット上に例とチュートリアルがたくさんあります。

その後編集:

イベントフィルタを使用することも可能があります:

// Install event filter 
MyDlg::MyDlg() 
{ 
    qApp->installEventFilter (this); 
} 

// search for the view of the combo to be activated 
// and fill it. 
bool MyDlg::eventFilter (QObject * obj, QEvent * event) 
{ 
    QSet<QAbstractItemView *> myComboViews; 

    my_combos.insert(combo1->view()); 

    if (event->type() == QEvent::Show) 
    { 
     QAbstractItemView * view = qobject_cast<QAbstractItemView*>(obj); 
     if (myComboViews.contains(obj) && view->isVisible()) 
     { 
      fillComboView(view); 
     } 
    } 
    return QDialog::eventFilter (obj, event); 
} 

コードがテストされていないが、あなたはideeaを得ることができます。

+0

ありがとうDragos、私はあなたが言ったようにスレッドを行うことを試みています。コンボボックスのようなイベントがありますか?それについての詳細を教えてください。 – pravin

+0

このために放出された信号は見つかりませんでしたが、イベントフィルタを使用できます。マウスクリックがフィルタリングするのが難しいため、ドロップダウンボタンにアクセスできないため、コンボの表示でshowイベントを使用することをお勧めします。 –

関連する問題