Es ist noch nicht möglich, Vorlagen und Q_OBJECT zu mischen, aber je In Ihrem Anwendungsfall können Sie die neue 'connect'-Syntax verwenden. Dies ermöglicht zumindest die Verwendung von Vorlagen-Slots.
Klassische Nicht-Arbeitsansatz:
class MySignalClass : public QObject {
Q_OBJECT
public:
signals:
void signal_valueChanged(int newValue);
};
template<class T>
class MySlotClass : public QObject {
Q_OBJECT
public slots:
void slot_setValue(const T& newValue){ /* Do sth. */}
};
Wunsch Nutzung aber nicht übersetzbar:
MySignalClass a;
MySlotClass<int> b;
QObject::connect(&a, SIGNAL(signal_valueChanged(int)),
&b, SLOT(slot_setValue(int)));
Error: Template classes not supported by Q_OBJECT (For MySlotClass).
Lösung mit neuen die ‚Connect'-Syntax:
// Nothing changed here
class MySignalClass : public QObject {
Q_OBJECT
public:
signals:
void signal_valueChanged(int newValue);
};
// Removed Q_OBJECT and slots-keyword
template<class T>
class MySlotClass : public QObject { // Inheritance is still required
public:
void slot_setValue(const T& newValue){ /* Do sth. */}
};
Nun können wir gewünschte 'MySlotClass'-Objekte instanziieren und mit entsprechenden Signalemittern verbinden.
MySignalClass a;
MySlotClass<int> b;
connect(&a, &MySignalClass::signal_valueChanged,
&b, &MySlotClass<int>::slot_setValue);
Fazit: Template-Slots ist möglich. Das Ausgeben von Vorlagensignalen funktioniert nicht, da aufgrund von fehlendem Q_OBJECT ein Compilerfehler auftreten wird.
Haben Sie das Inklusionsmodell beobachtet? :) http://linuxtopia.org/online_books/programming_books/c++_practical_programming/c++_practical_programming_134.html –
@Armen Ja, ich habe nicht darüber nachgedacht. Ich dachte, qt preprocessor würde es kauen. –