qt使用模板类不支持Q_OBJECT吗
时间: 2023-08-21 09:03:35 浏览: 422
Qt5开发及实例-CH208.rar,Qt5以QPushButton为例介绍按钮的用法的代码
在Qt中,使用模板类是支持Q_OBJECT宏的。但是需要注意的是,由于模板类的实例化是在编译期间完成的,而MOC是在运行期间对QObject进行元对象处理的,所以需要在模板类的派生类中显式实例化模板类,以便MOC能够正确处理派生类的元对象信息。
示例代码如下:
```cpp
// MyTemplateClass.h
#ifndef MYTEMPLATECLASS_H
#define MYTEMPLATECLASS_H
#include <QObject>
template<typename T>
class MyTemplateClass : public QObject
{
Q_OBJECT
public:
explicit MyTemplateClass(QObject *parent = nullptr);
T add(T a, T b);
private:
T m_value;
};
#endif // MYTEMPLATECLASS_H
```
```cpp
// MyTemplateClass.cpp
#include "MyTemplateClass.h"
template<typename T>
MyTemplateClass<T>::MyTemplateClass(QObject *parent)
: QObject(parent)
{
}
template<typename T>
T MyTemplateClass<T>::add(T a, T b)
{
m_value = a + b;
emit valueChanged(m_value);
return m_value;
}
// 显式实例化模板类
template class MyTemplateClass<int>;
```
```cpp
// main.cpp
#include <QCoreApplication>
#include "MyTemplateClass.h"
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
MyTemplateClass<int> myClass;
QObject::connect(&myClass, &MyTemplateClass<int>::valueChanged, [](int value){
qDebug() << "Value changed:" << value;
});
myClass.add(1, 2);
return a.exec();
}
```
需要注意的是,在模板类的实现文件中,需要显式实例化模板类,否则会导致链接错误。同时,由于模板类的实例化是在编译期间完成的,所以需要在模板类的构造函数中将QObject的parent指针传递到基类的构造函数中,以便正确处理QObject的生命周期。
阅读全文