标题:在共享库的封装中不能使用信号和槽机制吗?C2491
作者:xledoo
日期:2019-10-21 15:19
内容:
如题,需要封装一个类,类中使用了信号与槽的机制,这样就必须申明Q_OBJECT,导出的时候没有什么问题,在导入使用的时候提示:
warning: C4273: “TestLib::qt_static_metacall”: dll 链接不一致
C2491:TestLib::staticMetaObject”: 不允许 dllimport 静态数据成员 的定义查询以后发现在 Q_OBJECT 这个宏定义里包含静态的定义,所以编译不过,如果是这样的话但凡是继承QObject的子类导出以后都不能使用了吗?
那岂不是信号和槽无法封装到DLL了?是我方法不对还是确实是这样的呢?
我看很多自定义控件也有封装成DLL的,应该也是有使用信号槽机制的封装,如何破?
#1 [20091001753 10-21 15:31]
这个类必须继承自 QObject,而且有 Q_OBJECT 标识符。
#2 [dbzhang800 10-21 19:49]
假定你的共享库中有一个头文件 a.h,其中Q_OBJECT
如果你使用的qmake
那么生成共享库时,a.h 应该加入 HEADERS 中
使用共享库是,a.h不应加入 HEADERS 中
#3 [snow_man_0 10-21 21:14]
封装时,类中使用了SINGAL和SLOT时,须申明Q_OBJECT。使用LAMDA表达式或函数地址做槽,不需要Q_OBJECT
使用时,继承这个封装的类,不用加Q_OBJECT
#4 回 dbzhang800 的帖子 [xledoo 10-21 21:56]
dbzhang800:假定你的共享库中有一个头文件 a.h,其中Q_OBJECT
如果你使用的qmake
那么生成共享库时,a.h 应该加入 HEADERS 中
....... (2019-10-21 19:49)
大概意思是不是这样:
1、在封装导出的时候类里需要加入 Q_OBJECT;
2、在使用的时候把*.h里的 Q_OBJECT去掉
是这个意思吗?
#5 回 snow_man_0 的帖子 [xledoo 10-21 21:58]
snow_man_0:封装时,类中使用了SINGAL和SLOT时,须申明Q_OBJECT。使用LAMDA表达式或函数地址做槽,不需要Q_OBJECT
使用时,继承这个封装的类,不用加Q_OBJECT
(2019-10-21 21:14)
使用的时候把头文件里的Q_OBJECT去掉就可以了?