仍然无法混合使用模板和 Q_OBJECT,但根据您的用例,您可以使用新的“连接”语法。这至少允许使用模板槽。
经典的非工作方法:
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)));
错误:Q_OBJECT 不支持模板类(对于
MySlotClass)。
使用新的“连接”语法的解决方案:
// 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 会发生编译器错误,因此无法发出模板信号。