0

非同期でウィジェットを作成し、それをメインスレッドのダイアログに割り当てたいと思います。ウィジェットを作成する関数があります。

shared_ptr<QTableWidget> createTable() {
    auto table = make_shared<QTableWidget>()

    // ... add some items to the table

    return table;
}

この関数を同期的に呼び出すと、すべてが期待どおりに機能します。問題は、この関数を非同期で呼び出す場合です。

auto futureWidget = QtConcurrent::run(createWidget);

私はQFutureWatcher::finished()signalを使用し、ウィジェットの作成が完了したら、そのウィジェットをメイン/GUIスレッドのダイアログに追加しようとします。

問題は、テーブルにアイテムを追加すると、SIGSEGでクラッシュすることがあるということです。完了すると、作成されたウィジェットが表示されない場合があります。また、GUIスレッドの外部でのpixmapの使用に関する標準出力には多くの警告があります。

Qtの別のスレッドでウィジェットを作成することはできませんか?可能であれば、どのようにそれを行うのですか?

4

1 に答える 1

5

いいえ、メインスレッド内でのみGUIウィジェットを作成できます。

通常、ウィジェットのGUI部分を作成するのにそれほど時間はかかりません。時間がかかる操作がある場合は、ウィジェット作成のプロセスから抽出し、別のスレッドで処理してから、この操作の結果を新しく作成したウィジェットに渡す必要があります。

編集

ウィジェットに複雑なテーブルがある場合は、Qt MVCシステム、つまりQTableViewに基づくモデルを使用する必要がありますQAbstractTableModel。次に、モデルを別のスレッドに入力してから、メインスレッドで作成されたビューに割り当てることができます。

于 2012-10-24T14:48:57.170 に答える