2011-12-24 10 views
7

最近、特定のオブジェクトのシグナルスロットの接続順序に依存する特定の動作が原因で発生したコードに問題が発生しました。これは私のための設計上の欠陥です(接続は常に動的であるため、この欠陥は避けられませんでした)。シグナルスロットの接続順序を変更する

オブジェクト内の信号スロット接続を再注文することはできますか? 作成時に接続の「インデックス」を指定しますか?

は、私はあなたがすべての接続を破棄し、新しい順序でそれらを再作成することによって、この効果をシミュレートすることができますことを理解するが、それは私が求めていたものではありません。私はAPIや一般的なドキュメントで何も見つけられなかったので、答えはノーだと思うが、私はとにかく尋ねるべきだと思った...

答えて

10

逆に何かseemed to be the past understanding、私はQtはスロット呼び出しの順序を未定義にしていませんでした。

複数のスロットが1つの信号に接続されている場合、接続された順にスロットが順次実行され、信号が発せられたとき。 (1は、1つの文書中の一文は、過去と未来のすべてのQt 4.Xバージョンのための「強い」保証を表現するのに十分でないことを主張するかもしれないけど。)http://doc.qt.io/qt-4.8/signalsandslots.html#signals

シグナルとスロットを並べ替えるためのAPIがないようです。たとえあったとしても、その注文に頼っているのはとても良いアイデアではないと感じています。私はデザインを考え直すことをお勧めします。

調査することの1つは、スロットが直接アクションを実行するのではなく、アクションをキューに入れるようにすることです。その後、すべてのスロットが呼び出されたら、そのキューを処理して優先度属性を考慮に入れます。

+0

私が質問したように、それは設計上の欠陥であると認識していますが、API開発者は上品であるかどうかにかかわらず、スティッキーな状況から抜け出すために必要なものすべてを私たちに与えるべきです。私はこれが明らかなものだと思っていただろうが、インターネット上でそれについて質問することさえないと判断して、私がそこに間違っていることを示している! – cmannett85

+0

2種類の政治的自由(「自由」と「自由」)があるように、APIデザインには2種類の強力さがあります。この場合、信号を並べ替える機能を持たないのはいいと思いますが、契約上の注文があるという主張には不自然なようです。 * shrug * http://hostilefork.com/2005/07/04/freedom-to-and-freedom-from/ – HostileFork

0

QObjectは内部的に接続をリストとして格納します。 <private/qobject_p.h>ヘッダーを使用して送信者の接続リストのロックを取得し、そのエントリの順序を変更するのは簡単です。パブリックAPIを使用すると、各主要なQtリビジョンの間、この詳細が固定されますが、これはあまりにも制限的であるとみなされました。

関連する問題