-2

我有这样的事情:

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

然后我有一个管理事物的对象,如下所示:

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

我的问题是:ManyThing 集合中的事物分散在几个不同的线程中。我想让 makeThingDoSomething(int) 调用 things_[thingIndex]->doSomething() 插槽,就好像插槽是从与 Qt::AutoConnection 连接的信号中调用的一样。本质上是这样,但如果 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 上的插槽,而不仅仅是特定的插槽。有什么方法可以轻松设置连接,以便我可以根据传递给信号的索引参数将相同的信号连接到不同对象的插槽,或者其他什么?或者以某种方式使用 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 回答