最近 Qt を使い始めたので、シグナル/スロット メカニズムについて明確にする必要があります。GUI と、別のスレッドに存在するオブジェクト間の通信のための優れたツールであることは理解していますが、次のような単純なケースで使用する必要があるかどうかはよくわかりません。
私は 3 つのクラスを持っています。それらを MainWindow、DataManager、および DataWorker と呼びましょう。DataWorker は別のスレッドに存在し、新しいデータを収集する準備ができたときに通知します。その後、いくつかの処理の後、MainWindow ウィジェットで視覚化されます。GUI クラスを処理コードで汚染しないように DataManager クラスを作成しました。
では、DataManager と MainWindow の間の通信をどのように処理すればよいでしょうか。
オプション #1 - MainWindow へのポインターをメンバーとして持ち、そのメソッドを呼び出すだけ
class MainWindow
{
private:
DataManager* dm;
public:
MainWindow() : dm(new DataManager(this)) { }
displayData(const char* processedData);
}
class DataManager : QObject
{
private:
MainWindow *mw;
private slots;
eventNewData()
{
// get and process the data
mw = this->QObject.parent();
mw->displayData(const char* processedData);
// release data
}
}
オプション #2 - MainWindow スロットを呼び出す新しいデータを通知する
class MainWindow
{
private:
DataManager* dm;
private slots:
displayData(const char* processedData);
public:
MainWindow() : dm(new DataManager(this)) { QObject::connect(dm, SIGNAL(newData(const char*)), this, SLOT(displayData(const char*)); }
};
class DataManager : QObject
{
signals:
newData(const char* processedData);
private slots;
eventNewData()
{
// get and process the data
emit newData(processedData);
// release data
}
}
オプション 1 はより直感的に思えますが、Qt についてはよくわかりません。newData() シグナルに反応させたいクラスがさらにある場合、シグナルとスロットを使用する利点が分かります。
では、どちらがより良いオプションであり、2 つの間にパフォーマンスの違いはありますか?