1

次のような、これに似たいくつかの質問を見つけました。

しかし、ほとんどの例と回答は、1 つの GUI スレッドと 1 つのデータ処理スレッドに関するものでした。

私のシナリオを説明しましょう。

私は3つのクラスを持っています:

  1. class MainWindow (クラスから継承されQMainWindow、メイン GUI として機能)
  2. クラス LogInWidget (クラスから継承QWidget。このクラスは、すべてのユーザー名/パスワード フィールド + プログレス バーで構成されます。下の画像を参照してください)

ログインウィジェット

3.class DataTableWidget (QWidget数十万のデータを表示するテーブルからなる class.consist から継承)

このプログラムは、ユーザーが 経由でプログラムにログインすると、LogInWidgetによって表示されるすべてのデータを見ることができるように設計されていDataTableWidgetます。

.setCentralWidgetメソッドを使用して と の両方を設定LogInWidgetDataTableWidgetます(つまり、ユーザーパスワードが正しい場合は、使用します

table = DataTableWidget ()
self.setCentralWidget(table)

テーブルを表示します。

私の問題は次のとおりです。ユーザーがログインすると、テーブルを介して表示するデータエントリが非常に多いため、データテーブルを表示する前に大きな GUI がフリーズします。

LogInWidgetしたがって、プログラムがテーブルのロードを完了する前に、ビジー プログレス バーを (my に) 表示したいと思います。

を使って実現しようと思ったのQthreadですが、プログレスバーの表示DataTableWidgetとcentralwidgetの作成・設定の両方がGUIのタスクなので、どのようにアプローチすればよいでしょうか?

4

2 に答える 2

1

それを行う簡単な方法はありません。ただし、ここにアイデアがあります:

@scholii が言うように、レンダリング中に発行される信号が必要ですDataTableWidget。そのような信号は存在しません。たとえそうであったとしても、ウィジェットがレンダリングされるまで処理されません。

ただし、モデルがある場合は、基本クラスのメソッドを呼び出すだけでプログレス バーを更新する独自DataTableWidgetのメソッドでメソッドをオーバーライドできます(ただし、プログレス バーは最初にテーブルをレンダリングするときにのみ更新され、その後の への呼び出し中は更新されません)。ビューがレンダリングされると、ビューはメソッドを何度も呼び出します。このようにして、レンダリング プロセス中に特定の時点にアクセスできます。data()data()data()data()

もちろん、制御がイベント ループに戻る (レンダリングが終了する) までプログレス バーは再描画されませんが、おそらく を呼び出すことで回避できますQApplication.processEvents()

これは非常にハックであり、一般的に悪い習慣であり、モデル ビュー パラダイムを完全に破壊することに注意してください。私はそれをすることをお勧めしません。しかし、とにかく同じ結果を達成する方法は考えられません。おそらく、 のレンダリングを高速化できますDataTableWidget。たとえば、QTableView.resizeColumnsToContents()は遅いことが知られています。どこかでそう呼んでいますか?

于 2014-03-28T11:00:49.533 に答える