Qt(4.8)使用AutoConnection行为调用插槽的最简单方法

时间:2013-04-23 20:16:06

标签: multithreading qt signals qobject slot

我有这样的事情:

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] - &gt; 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的信号/插槽机制调用插槽而不必实际创建信号?

1 个答案:

答案 0 :(得分:1)

尝试使用QMetaObject::invokeMethod

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

请注意,如果您使用此方法,doSomething可能必须保留一个插槽。