-2

私はこのようなものを持っています:

class Thing : public QObject {
  ...
  public slots:
    void doSomething ();
  ...
};

次に、次のように、Things を管理するオブジェクトを作成します。

class ManyThings : public QObject { 
  ...
  public: 
    void makeThingDoSomething (int thingIndex);
  private:
    QVector<Thing *> things_;
  ...
};

私の質問は次のとおりです。ManyThing のコレクション内のモノは、いくつかの異なるスレッドに散らばっています。Qt::AutoConnection に接続されたシグナルからスロットが呼び出されたかのように、makeThingDoSomething(int) で things_[thingIndex]->doSomething() スロットを呼び出したいと思います。基本的にはこれですが、Thing が呼び出し元とは異なるスレッドにある場合は、Qt のキューイング メカニズムを使用します。

void ManyThings::makeThingDoSomething (int thingIndex) {
  // i want to do this AutoConnection style, not direct:
  things_[thingIndex]->doSomething();
  // doesn't *need* to block for completion
}

これを設定する最も簡単な方法は何ですか? ManyThings で信号を作成し、Thing の各スロットに接続することもできますが、その信号を発信すると、特定の Thing だけでなく、すべての Thing のスロットが呼び出されます。信号に渡されるインデックス パラメータなどに応じて、同じ信号を異なるオブジェクトのスロットに接続できるように、接続を簡単に設定する方法はありますか? または、実際にシグナルを作成することなく、Qt のシグナル/スロット メカニズムを使用してスロットを呼び出す方法はありますか?

4

1 に答える 1

1

使ってみてくださいQMetaObject::invokeMethod:

void ManyThings::makeThingDoSomething(int thingIndex) {
   QMetaObject::invokeMethod(things_[thingIndex], "doSomething", 
                             Qt::AutoConnection);
}

doSomethingこのアプローチを使用する場合、おそらくスロットのままにしなければならないことに注意してください。

于 2013-04-23T20:40:28.247 に答える