QT中含Q_OBJECT的辅助类如何在CPP文件中隐藏并处理?
1. 让moc处理CPP文件中含Q_OBJECT的类定义的方法
当然可以,有几种实用的实现方式:
修改项目.pro文件:把包含Q_OBJECT宏的CPP文件添加到
HEADERS列表中,示例:HEADERS += your_helper_class.cppqmake会自动识别并让moc处理该文件,生成对应的moc_xxx.cpp并参与编译。
手动调用moc工具:直接用moc命令处理目标CPP文件,生成moc代码文件后加入项目编译。比如在终端执行:
moc your_helper_class.cpp -o moc_your_helper_class.cpp随后在.pro文件中将生成的文件添加到
SOURCES:SOURCES += moc_your_helper_class.cpp在CPP文件中包含生成的moc文件:在辅助类CPP文件的末尾添加:
#include "moc_your_helper_class.cpp"确保通过上述两种方式触发moc生成对应文件,编译时就会自动包含moc生成的代码。
2. 隐藏辅助类的替代方案
如果不想让moc处理CPP文件,还有这些常用的隐藏手段:
Pimpl惯用法:在公共头文件(比如你的Widget头文件)中仅声明辅助类的前向引用,把辅助类的具体定义和实现放在CPP文件里。示例:
// widget.h (公共头文件)class HelperClass; // 前向声明 class MyWidget : public QWidget { Q_OBJECT private: HelperClass* m_helper; };// widget.cpp
class HelperClass : public QObject { Q_OBJECT // 辅助类的成员和实现 }; // 配合第一种方法的任意一种让moc处理该cpp文件公共头文件中完全看不到辅助类的细节,实现了隐藏。
使用私有头文件:把辅助类的定义放在命名为
xxx_p.h的私有头文件中(比如helper_p.h),然后在项目.pro文件中设置:PRIVATE_HEADERS += helper_p.h这个私有头文件不会被打包到库的公共头文件集合中,外部用户无法访问,同时moc可以正常处理该头文件里的Q_OBJECT类。这是QT官方库常用的内部类隐藏方式。
简化辅助类的元对象依赖:如果你的辅助类不需要信号槽、属性等Q_OBJECT提供的元对象功能,可以考虑用
Q_GADGET宏代替Q_OBJECT,或者直接不继承QObject。这样不需要moc处理,类定义放在CPP文件里也不会有链接问题,自然实现隐藏。不过这只适用于不需要QObject核心特性的场景。
内容的提问来源于stack exchange,提问作者user2683038

