2013-04-23 1 views
-3

내가 이런 걸 가지고 : 다음 사항을 관리하는 개체가Qt는 AutoConnection 행동과 슬롯을 호출 (4.8) 간단한 방법

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

,이 같은 :

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

내 질문입니다 this : ManyThing 컬렉션의 것들은 몇 가지 다른 스레드로 분산되어 있습니다. makeThingDoSomething (int)은 Qt :: AutoConnection과 연결된 신호에서 슬롯이 호출 된 것처럼 things_ [thingIndex] -> doSomething() 슬롯을 호출하려고합니다. 기본적으로이 있지만 것은 호출자와 다른 스레드에있는 경우 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의 신호/슬롯 메커니즘을 사용하여 실제로 신호를 생성하지 않고 슬롯을 호출하는 방법은 무엇입니까? QMetaObject::invokeMethod를 사용

답변

1

보십시오 가능성이 방법을 사용하는 경우 슬롯을 유지해야합니다

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

doSomething있다.

+0

정확히 내가 무엇을 찾고 있었습니까. 감사! –

+0

메소드 이름을 바꾸면 리팩토링 도구가이 호출을 처리 할 수 ​​없습니다. –

+0

@ RafałPrzemysławMalinowski Visual Studio 용 Visual Assist X 플러그인에 포함 된 것과 같은 일부 리팩토링 도구는 메서드 이름을 변경하여이를 처리 할 수 ​​있습니다. –