• 6141阅读
  • 8回复

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

上一主题 下一主题
离线xledoo
 

只看楼主 倒序阅读 楼主  发表于: 2019-10-21
如题,需要封装一个类,类中使用了信号与槽的机制,这样就必须申明Q_OBJECT,导出的时候没有什么问题,在导入使用的时候提示:

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

只看该作者 1楼 发表于: 2019-10-21
这个类必须继承自 QObject,而且有 Q_OBJECT 标识符。
(づ ̄ 3 ̄)づ
离线dbzhang800

只看该作者 2楼 发表于: 2019-10-21
假定你的共享库中有一个头文件 a.h,其中Q_OBJECT

如果你使用的qmake

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

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

只看该作者 3楼 发表于: 2019-10-21
封装时,类中使用了SINGAL和SLOT时,须申明Q_OBJECT。使用LAMDA表达式或函数地址做槽,不需要Q_OBJECT
使用时,继承这个封装的类,不用加Q_OBJECT
离线xledoo

只看该作者 4楼 发表于: 2019-10-21
回 dbzhang800 的帖子
dbzhang800:假定你的共享库中有一个头文件 a.h,其中Q_OBJECT
如果你使用的qmake
那么生成共享库时,a.h 应该加入 HEADERS 中
....... (2019-10-21 19:49) 

大概意思是不是这样:
1、在封装导出的时候类里需要加入 Q_OBJECT;
2、在使用的时候把*.h里的 Q_OBJECT去掉

是这个意思吗?
离线xledoo

只看该作者 5楼 发表于: 2019-10-21
回 snow_man_0 的帖子
snow_man_0:封装时,类中使用了SINGAL和SLOT时,须申明Q_OBJECT。使用LAMDA表达式或函数地址做槽,不需要Q_OBJECT
使用时,继承这个封装的类,不用加Q_OBJECT
 (2019-10-21 21:14) 

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

只看该作者 6楼 发表于: 2019-10-22
回 xledoo 的帖子
xledoo:大概意思是不是这样:
1、在封装导出的时候类里需要加入 Q_OBJECT;
2、在使用的时候把*.h里的 Q_OBJECT去掉
....... (2019-10-21 21:56) 

不是
离线snow_man_0

只看该作者 7楼 发表于: 2019-10-22
回 xledoo 的帖子
xledoo:使用的时候把头文件里的Q_OBJECT去掉就可以了? (2019-10-21 21:58) 

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

只看该作者 8楼 发表于: 2019-10-22
    
https://wiki.qt.io/Qt_5.12_Release
https://wiki.qt.io/New_Features_in_Qt_5.12
https://wiki.qt.io/Qt_5.12.0_Known_Issues
https://www.qt.io/blog/qt-5.13.2-released
https://www.qt.io/blog/qt-creator-4.10.2-released
https://wiki.qt.io/Qt_5.12_Tools_and_Versions
快速回复
限100 字节
 
上一个 下一个