我有这样的事情:
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的信号/插槽机制调用插槽而不必实际创建信号?
答案 0 :(得分:1)
尝试使用QMetaObject::invokeMethod
:
void ManyThings::makeThingDoSomething(int thingIndex) {
QMetaObject::invokeMethod(things_[thingIndex], "doSomething",
Qt::AutoConnection);
}
请注意,如果您使用此方法,doSomething
可能必须保留一个插槽。