2013-04-23 65 views
-3

我有這樣的事情:QT(4.8)來調用插槽與自動連接行爲最簡單的方法

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連接的信號調用插槽一樣。從本質上講這一點,但使用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

嘗試使用QMetaObject::invokeMethod

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

注意doSomething將可能有,如果你用這種方式來保持一個縫隙。

+0

正是我在找的東西。謝謝! – 2013-04-23 20:52:12

+0

請注意,重做方法重命名時,任何重構工具都無法處理此調用。 – 2013-04-24 09:11:28

+0

@RafałPrzemysławMalinowski一些重構工具(如Visual Studio的Visual Assist X插件中包含的重構工具)可以通過重命名方法來處理。 – 2013-04-24 19:16:20

相關問題