Это еще нельзя смешивать шаблоны и Q_OBJECT, но в зависимости в вашем случае использования вы можете использовать новый синтаксис «connect». Это позволяет, по крайней мере, использовать шаблоны-слоты.
Классическая нерабочим подход:
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. */}
};
Желаемая использование, но не компилируется:
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).
Решение с использованием нового в «connect'-синтаксис:
// 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. */}
};
Теперь мы можем создать нужные объекты MySlotClass и подключить их к соответствующим источникам сигнала.
MySignalClass a;
MySlotClass<int> b;
connect(&a, &MySignalClass::signal_valueChanged,
&b, &MySlotClass<int>::slot_setValue);
Вывод: Использование шаблонов слотов возможно. Испускание шаблонных сигналов не работает, поскольку ошибка компилятора возникает из-за отсутствия Q_OBJECT.
Вы наблюдали модель включения? :) http://linuxtopia.org/online_books/programming_books/c++_practical_programming/c++_practical_programming_134.html – 2010-12-09 11:04:42
@Armen Да, я об этом не думал. Я думал, что препроцессор qt захочет его записать. – 2010-12-09 11:07:54