是否有可能创建一个从 QObject 继承(并在其声明中具有 Q_OBJECT 宏)的模板类?
我想创建一个适配器,用于槽函数,它可以执行一些操作,但是槽函数可以接受任意数量的参数(参数数量取决于模板参数)。
我尝试了这样做,但得到了链接器错误。我猜 gmake 或 moc 没有调用这个模板类。有没有一种方法来解决这个问题?也许通过显式实例化模板?
是否有可能创建一个从 QObject 继承(并在其声明中具有 Q_OBJECT 宏)的模板类?
我想创建一个适配器,用于槽函数,它可以执行一些操作,但是槽函数可以接受任意数量的参数(参数数量取决于模板参数)。
我尝试了这样做,但得到了链接器错误。我猜 gmake 或 moc 没有调用这个模板类。有没有一种方法来解决这个问题?也许通过显式实例化模板?
不可能同时混合使用模板和Q_OBJECT,但如果您有一个类型的子集,可以像这样列出槽和信号:
class SignalsSlots : public QObject
{
Q_OBJECT
public:
explicit SignalsSlots(QObject *parent = 0) :
QObject(parent) {}
public slots:
virtual void writeAsync(int value) {}
virtual void writeAsync(float value) {}
virtual void writeAsync(double value) {}
virtual void writeAsync(bool state) {}
virtual void writeAsync(svga::SSlideSwitch::SwitchState state) {}
signals:
void readAsynkPolledChanged(int value);
void readAsynkPolledChanged(float value);
void readAsynkPolledChanged(double value);
void readAsynkPolledChanged(bool state);
void readAsynkPolledChanged(svga::SSlideSwitch::SwitchState state);
};
...
template <class T>
class Abstraction : public SignalsSlots
{...
void someSignal(T value)
。 - bweber考虑到一些限制:你可以这样做。
首先,请熟悉(如果还没有的话)https://doc.qt.io/archives/qq/qq16-dynamicqobject.html。-这将有助于实现它。
关于限制:您可以拥有一个模板QObject类,即继承自QObject的模板类,但是:
希望这有所帮助。
目前还无法混合使用模板和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)));
错误:模板类不支持Q_OBJECT(对于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. */}
};
MySignalClass a;
MySlotClass<int> b;
connect(&a, &MySignalClass::signal_valueChanged,
&b, &MySlotClass<int>::slot_setValue);
我尝试显式实例化模板,结果出现了以下错误:
core_qta_qt_publisheradapter.hpp:96: 错误:Q_OBJECT不支持模板类
我想这回答了我的问题。
编辑
实际上,如果我将整个模板类定义放在头文件中,则qt预处理器不会处理它,然后我会得到链接器错误。因此,如果我添加缺少的方法,就必须能够做到这一点。
编辑#2
这个库正是我想要的 - 使用自定义信号/槽机制,其中槽没有定义的签名。