标题:自定义宏嵌套Q_INTERFACES编译出来的插件无法加载?
作者:zhlgh603
日期:2016-07-20 11:29
内容:
1.原因:
原有项目使用Qt4.8开发,并使用Qt插件框架
现项目要迁移到Qt5,Qt5中插件定义使用的宏与Qt4中的不一致
2.想法:
使用自定义宏根据Qt版本调用对应的Qt插件宏定义
3.实现:
# ifdef Qt4
# defineMY_INTERFACES(x) Q_INTERFACES(x)
# defineMY_EXPORT_PLUGIN(PLUGIN, PLUGINCLASS) \
Q_EXPORT_PLUGIN2(PLUGIN, PLUGINCLASS)
# endif
# ifdef Qt5
# defineMY_EXPORT_PLUGIN(PLUGIN, PLUGINCLASS) \
# defineMY_INTERFACES(x) \
Q_INTERFACES(x) \
Q_PLUGIN_METADATA(IID MODULENAME FILE MODULENAME_FILENAME)
# endif
class CONFIG_EXPORT AppconfigManager : public QObject , PluginInterface
{
Q_OBJECT
MY_INTERFACES(PluginInterface)
public:
AppconfigManager() {}
~AppconfigManager() {}
//...省略PluginInterface接口的实现
}
其中在.pro中定义MODULENAME和生成MODULENAME_FILENAME
DEFINES += MODULENAME=\\\"$$TARGET\\\"
DEFINES += MODULENAME_FILENAME=\\\"$${TARGET}.json\\\"
MODULENAME = $$TARGET
MODULENAME_FILENAME = $${TARGET}.json
#生成插件文件
PLUGIN_METADATA = $$MOUDLE_FILENAME
PLUGIN_METADATA_FILENAME = $$_PRO_FILE_PWD_/$$PLUGIN_METADATA
!exists($$PLUGIN_METADATA_FILENAME) {
system(echo \{\} >$$PLUGIN_METADATA_FILENAME)
}
OTHER_FILES += $$PLUGIN_METADATA_FILENAME
4.问题:
编译提示:appconfigmanager.h:20: Warning: Class AppconfigManager implements the interface PluginInterface but does not list it in Q_INTERFACES. qobject_cast to PluginInterface will not work!
运行时使用QPluginLoader加载该插件
&nbs ..
#1 [zhlgh603 07-20 16:29]
qt484\src\tools\moc\preprocessor.cpp
void Preprocessor::preprocess(const QByteArray &filename, Symbols &preprocessed)
{
......
case PP_DEFINE:
#2 [never_forget 07-22 08:35]
虽然看不懂,但是好厉害!