todavía no es posible plantillas y Q_OBJECT mezcla, pero dependiendo en su caso de uso, puede usar la nueva sintaxis 'connect'. Esto permite al menos el uso de ranuras de plantilla.
enfoque clásico no trabaja:
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. */}
};
el uso deseado, pero no compilables:
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).
solución usando la nueva 'connect'-sintaxis:
// 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. */}
};
Ahora podemos instanciar los objetos 'MySlotClass' que desee y conectarlos a los emisores de señal apropiados.
MySignalClass a;
MySlotClass<int> b;
connect(&a, &MySignalClass::signal_valueChanged,
&b, &MySlotClass<int>::slot_setValue);
Conclusión: Uso de plantilla ranuras es posible. La emisión de señales de plantilla no funciona, ya que se producirá un error de compilación debido a que falta Q_OBJECT.
¿Has observado el modelo de inclusión? :) http://linuxtopia.org/online_books/programming_books/c++_practical_programming/c++_practical_programming_134.html –
@Armen Sí, no pensé en eso. Pensé que el preprocesador de qt lo mataría. –