AFAIK、これは悪い習慣であるとQtのドキュメントには何も書かれていません。
私は特別に私のオブジェクトは何かが(COMポート、またはBluetooth接続をリスニング)スレッドから起こったとGUIの更新が必要とされている通知され場合には、この何回もやった:
MyObject::MyObject()
{
connect(this, SIGNAL(dataReceived(QString)), this, SLOT(showData(QString)), Qt::ConnectionType::QueuedConnection);
}
void MyObject::receiveSomeData(QString data)
{
// a worked thread called this function...
// we are not in the main thread here, it's unsafe to update the GUI,
// calling showData(data) will lead most likely lead to crashs or Qt warnings
// so let's delay it's execution by emitting dataReceived!
emit dataReceived(data);
}
void MyObject::showData(QString data)
{
// now it's safe to update the GUI...we are back to main thread
m_ui.label->setText(data);
}
もやりましたこのようなQtベースのクラスコンストラクタでは、GUI操作を行う前にウィジェットが実際に表示されるのを待つ必要があります(ウィジェットのサイズにアクセスする必要があります...コンストラクタでレイアウトはまだウィジェットのサイズを制限する制約)。そして、ウィジェットコンストラクタからemit
signal
に接続し、この信号は、初期化を行うのと同じウィジェットクラスのslot
に接続しました。Qt::ConnectionType::QueuedConnection
は、ウィジェットが実際に見えるようになった後で初期化関数を実行します。
そして、これが関連している場所を他の状況があるかもしれません...
注:ymoreauはOPのコメントとして、これはまた、最も可能性が高いと同じことをやって終わるQMetaObject::invokeMethod
を使用することによりadressedすることができます。
私の意見では、これはアンチパターンではありませんが、デザインレベルで単純化できないユースケースはありません。なぜあなたの呼び出しを実行待ちにしたいのですか?単純なループはあなたのニーズに合っていませんか?そうでない場合は、シグナルと一緒に '[static] bool QMetaObject :: invokeMethod'を使ってまったく同じことをすることができます。 – ymoreau
シグナル(' MyFoo :: ready')とスロット( 'MyFoo: :ready')を別々のクラスに置く。彼らが別のクラスに属していれば、より良いデザインになるかもしれません。あなたの目的がスロットコールを待ち行列に入れることだけであるなら、あなたはこの[回答](https://stackoverflow.com/a/41910566/2666212)を見てみたいかもしれません。 – Mike