0

次のようにして、 QSystemTrayIcon クラスを別のスレッドクラスにしようとしています

  1. QThread から TrayIcon クラスを派生させました
  2. TrayIcon クラスに run() メソッドを実装
  3. TrayIcon 初期化コードを Run メソッドに移動

メインから TryIcon.start() を呼び出します。

しかし、TrayIcon クラスで "connect" ステートメントを実行中にアプリケーションがクラッシュしました。connect ステートメントは、trayIcon メニュー機能用です。

QTのドキュメント、例を読んで、QThread、接続機能を理解しようとしています。

4

1 に答える 1

0

そんなことはできません。すべての GUI コードは GUI スレッドに存在する必要があります。必要に応じて、トレイ アイコンの動作の時間のかかる部分を別の QObject に実装できます。次に、その QObject を別のスレッドに移動し、シグナル/スロット接続(スロットの直接呼び出しではありません!) を介して、またはイベントを投稿することによって、GUI スレッドから QObject と通信します。スロットを直接呼び出すのは無意味です。スロット コードは呼び出し元のスレッドで実行されますが、それは望ましくありません。

生活を楽にしたい場合は、QObject で便利なスロットを公開できます。これらは、実際の作業を行う保護されたスロットまたはプライベート スロットに接続されているだけです。QObject のコンストラクターでそのような接続を確立しますが、それは QueuedConnection でなければなりません。その後、コンビニエンス スロットを直接呼び出すことができます。バックグラウンドで、Qt は引数をマーシャリングし、QObject が存在するスレッドのイベント キューにイベントとして投稿します。そのスレッドのイベント ループは、キューからそれらを取得し、 QObject で機能するスロットへの呼び出しをディスパッチします。

于 2012-05-08T22:49:58.077 に答える