查看完整版本: [-- 在共享库的封装中不能使用信号和槽机制吗?C2491 --]

QTCN开发网 -> Qt基础编程 -> 在共享库的封装中不能使用信号和槽机制吗?C2491 [打印本页] 登录 -> 注册 -> 回复主题 -> 发表主题

xledoo 2019-10-21 15:19

在共享库的封装中不能使用信号和槽机制吗?C2491

如题,需要封装一个类,类中使用了信号与槽的机制,这样就必须申明Q_OBJECT,导出的时候没有什么问题,在导入使用的时候提示:

  1. warning: C4273: “TestLib::qt_static_metacall”: dll 链接不一致
    C2491:TestLib::staticMetaObject”: 不允许 dllimport 静态数据成员 的定义
查询以后发现在 Q_OBJECT 这个宏定义里包含静态的定义,所以编译不过,如果是这样的话但凡是继承QObject的子类导出以后都不能使用了吗?
那岂不是信号和槽无法封装到DLL了?是我方法不对还是确实是这样的呢?
我看很多自定义控件也有封装成DLL的,应该也是有使用信号槽机制的封装,如何破?

20091001753 2019-10-21 15:31
这个类必须继承自 QObject,而且有 Q_OBJECT 标识符。

dbzhang800 2019-10-21 19:49
假定你的共享库中有一个头文件 a.h,其中Q_OBJECT

如果你使用的qmake

那么生成共享库时,a.h 应该加入 HEADERS 中

使用共享库是,a.h  不应加入 HEADERS 中

snow_man_0 2019-10-21 21:14
封装时,类中使用了SINGAL和SLOT时,须申明Q_OBJECT。使用LAMDA表达式或函数地址做槽,不需要Q_OBJECT
使用时,继承这个封装的类,不用加Q_OBJECT

xledoo 2019-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去掉

是这个意思吗?

xledoo 2019-10-21 21:58
snow_man_0:封装时,类中使用了SINGAL和SLOT时,须申明Q_OBJECT。使用LAMDA表达式或函数地址做槽,不需要Q_OBJECT
使用时,继承这个封装的类,不用加Q_OBJECT
 (2019-10-21 21:14) 

使用的时候把头文件里的Q_OBJECT去掉就可以了?

dbzhang800 2019-10-22 09:53
xledoo:大概意思是不是这样:
1、在封装导出的时候类里需要加入 Q_OBJECT;
2、在使用的时候把*.h里的 Q_OBJECT去掉
....... (2019-10-21 21:56) 

不是

snow_man_0 2019-10-22 12:12
xledoo:使用的时候把头文件里的Q_OBJECT去掉就可以了? (2019-10-21 21:58) 

封装好的类的头文件不要改动

liulin188 2019-10-22 13:01
    


查看完整版本: [-- 在共享库的封装中不能使用信号和槽机制吗?C2491 --] [-- top --]



Powered by phpwind v8.7 Code ©2003-2011 phpwind
Gzip disabled