2017-06-22 8 views
3

Qtの同じオブジェクトに信号を送るのが悪い練習とアンチパターンと見なされるのか、それとも問題ないのでしょうか?Qtの同じオブジェクト(これなど)に信号を送信しているのですか?

は、私はこのような何かをしたいような状況で午前:

QObject::connect (this, &MyFoo::ready, 
        this, &MyFoo::execute, 
        Qt::ConnectionType::QueuedConnection); 

その後execute内側から私はemit readyしたいと思います。このためのモチベーションは、深い再帰を避けることです。私の代わりの方法は、executeexecuteから再帰的に呼び出すことです。

+0

私の意見では、これはアンチパターンではありませんが、デザインレベルで単純化できないユースケースはありません。なぜあなたの呼び出しを実行待ちにしたいのですか?単純なループはあなたのニーズに合っていませんか?そうでない場合は、シグナルと一緒に '[static] bool QMetaObject :: invokeMethod'を使ってまったく同じことをすることができます。 – ymoreau

+0

シグナル(' MyFoo :: ready')とスロット( 'MyFoo: :ready')を別々のクラスに置く。彼らが別のクラスに属していれば、より良いデザインになるかもしれません。あなたの目的がスロットコールを待ち行列に入れることだけであるなら、あなたはこの[回答](https://stackoverflow.com/a/41910566/2666212)を見てみたいかもしれません。 – Mike

答えて

0

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操作を行う前にウィジェットが実際に表示されるのを待つ必要があります(ウィジェットのサイズにアクセスする必要があります...コンストラクタでレイアウトはまだウィジェットのサイズを制限する制約)。そして、ウィジェットコンストラクタからemitsignalに接続し、この信号は、初期化を行うのと同じウィジェットクラスのslotに接続しました。Qt::ConnectionType::QueuedConnectionは、ウィジェットが実際に見えるようになった後で初期化関数を実行します。

そして、これが関連している場所を他の状況があるかもしれません...

注:ymoreauはOPのコメントとして、これはまた、最も可能性が高いと同じことをやって終わるQMetaObject::invokeMethodを使用することによりadressedすることができます。

関連する問題