Qt는

2016-06-29 4 views
1

에서 매크로 신호를 정의하는 방법은 같은 매크로 일부 클래스 definitionsfor, 일부의 standart 신호를 만들려고 :Qt는

#define CREATE_SIGNALS signals: void error_signal(QString error); 

기능이 생성되지만, MOC는 이러한 기능을위한 방법을 작성하지 않았다. 매크로가 처리되기 전에 moc가 실행중인 것처럼 보입니다. 이 작품을 어떻게 만들 수 있습니까?

+0

당신은 아마 당신이 원하는 일을 (그리고'moc' 사용) 할 수 없습니다

다음 완벽한 예입니다. ** 귀하의 질문을 ** 실제 실제 사례를 제공하고 * 귀하의 질문에 동기를 부여하기 위해 ** 수정하십시오. –

답변

2

Moc는 작동하는 소스를 사전 처리하므로 매크로가 실제로 매크로에서 일부 신호를 정의하고 일반 메서드가 아닌 매크로를 정의하면 매크로가 작동합니다.

#include <QtCore> 
#include <array> 
#include <algorithm> 

#define CREATE_SIGNALS\ 
    Q_SIGNAL void signal1(const QString & = QString());\ 
    Q_SIGNAL void signal2(int = 0); 

struct Foo : QObject { 
    CREATE_SIGNALS 
    Q_OBJECT 
}; 

struct Bar : QObject { 
    CREATE_SIGNALS 
    Q_OBJECT 
}; 

int main() 
{ 
    std::array<int, 4> s; 
    Foo foo; 
    Bar bar; 
    s.fill(0); 
    QObject::connect(&foo, &Foo::signal1, [&]{++s[0];}); 
    QObject::connect(&foo, &Foo::signal2, [&]{++s[1];}); 
    QObject::connect(&bar, &Bar::signal1, [&]{++s[2];}); 
    QObject::connect(&bar, &Bar::signal2, [&]{++s[3];}); 
    emit foo.signal1(); 
    emit foo.signal2(); 
    emit bar.signal1(); 
    emit bar.signal2(); 
    Q_ASSERT(std::all_of(std::begin(s), std::end(s), [](int val) { return val == 1; })); 
} 

#include "main.moc" 
+0

사실, #define CREATE_SIGNALS 신호로 매크로를 작성했습니다 : void error_signal (QString error); 작동하지 않았지만 Q_SIGNAL 이후에는 현재 작동 중입니다. – fyo

+1

@fyo Q_SIGNAL 및 Q_SLOT은 모든 경우에 사용할 수 있습니다. –