2016-06-29 6 views
1

ich versuche, ein einige standart Signal definitionsfor einige Klassen mit Makros wie zu erstellen:Wie Signale mit Makros in Qt definieren

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

Funktionen geschaffen, sondern moc erstellt haben diese Methoden nicht für diese Funktionen. Es scheint, dass Moc läuft, bevor Makros verarbeitet werden. Wie kann ich das schaffen?

+0

Sie können sich wahrscheinlich nicht tun, was Sie wollen (und verwenden 'moc'). Bitte ** bearbeite deine Frage **, um den tatsächlichen Fall anzugeben und * motiviere * deine Frage. –

Antwort

2

Moc verarbeitet die Quellen, an denen es arbeitet, so dass Ihr Makro funktioniert, sobald Sie das Makro tatsächlich einige Signale definieren lassen, und nicht normale Methoden.

Das Folgende ist ein komplettes Beispiel:

#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

Eigentlich schrieb ich Makro als #define CREATE_SIGNALS Signale: void error_signal (QString Fehler); Es funktionierte nicht, aber nach Q_SIGNAL funktioniert es jetzt. – fyo

+1

@fyo Die Q_SIGNAL und Q_SLOT funktionieren garantiert in allen Fällen. –