关于 qtpropertybrowser 扩展问题

qtpropertybrowser  是一个基于QT开发的属性展示控件,功能强大。

在WINDOWS平台,使用VC编译工具,如果将qtpropertybrowser 此库编译成DLL时,在程序中直接使用原始类没有问题,但如果自定义派生类且使用到信号槽时就会遇到一个编译问题,这个问题归根结底在于有没有使用dllimport  特性的问题。

dllexport 和 dllimport 存储类特性是 C 和 C++ 语言的 Microsoft 专用扩展。 可以使用它们从 DLL 中导出或向其中导入函数、数据和对象。可导出类的所有基类都必须是可导出的。 否则,会生成编译器警告。 此外,同样是类的所有可访问成员必须是可导出的。 此规则只允许 dllexport类从 dllimport 类继承,dllimport 类从 dllexport 类继承(但不建议后一种方式)。 通常来说,对 DLL 客户端可访问的所有内容(根据 C++ 访问规则)都应该是可导出接口的一部分。 这包括在内联函数中引用的私有数据成员。

     QT自己扩展了C++,并提供了MOC编译工具,编译其信号-槽机制,对所有要使用QT信号槽机制的派生类有两个要求: 

  1、必须派生自QObject或QObject的子类

  2、在派生类首端添加QT的宏 Q_OBJECT, 

原因就出在Q_OBJECT中,此宏声明了一个静态数据成员:static const QMetaObject staticMetaObject; 以使用基于QT系例的库时,必须使用 dllimport 编译指令导入数据。

QT 定义了QT_DLL宏,但qtpropertybrowser的宏名称设计就不是很好,也没有提供了相应的说明,但查看源代码会发现一个名为:QT_QTPROPERTYBROWSER_IMPORT 的宏,该宏控制了QT_QTPROPERTYBROWSER_EXPORT对应的定义。

   总结:使用qtpropertybrowser的dll库,并从库中类派生子类时,编译出现“无法解析的外部符 struct QMetaObject const”的链接错误时,请在程序预编译指令中加入

QT_QTPROPERTYBROWSER_IMPORT”。


你可能感兴趣的:(编程语言)