使用QT创建一个界面DLL给另一个QT程序使用,调用方是VS+QT使用Layout实现的程序。在DLL中有一个导出的界面类:
// 这个宏定义是在 PictureLoadDlg_global.h 里
#if defined(DLLPICTUREEDIT_LIBRARY)
# define DLLPICTUREEDIT_EXPORT Q_DECL_EXPORT
#else
# define DLLPICTUREEDIT_EXPORT Q_DECL_IMPORT
#endif
// PictureLoadDlg.h
class DLLPICTUREEDIT_EXPORT PictureLoadDlg
: public QDialog
{
Q_OBJECT
public:
explicit PictureLoadDlg(QWidget *parent, const QString &qstrTitle);
~PictureLoadDlg();
bool loadPicture(const QString & qstrPicturePath);
signals:
void sigClose();
private slots:
void onSigClose();
private:
Ui::PictureEditDlg * ui;
};
我在调用该DLL的QT程序里的对应的类的头文件中引入了PictureLoadDlg_global.h 和 PictureLoadDlg.h,并在项目中加入了这两个文件,在类中创建该导出界面类的指针,在初始化时创建对象,并隐藏,这里都是可以的,但是我需要在指定的操作后调用导出的界面类的 loadPicture 方法,这时候编译 VS 就会报错了。
// 声明 .h
#include "PictureLoadDlg.h"
class QPictureView
: public QWidget
{
Q_OBJECT
public:
QPictureView (QWidget *parent);
~QPictureView ();
private slots:
void onBtnLoadClicked();
private:
void setupUI();
void connectSignalsSlots();
private:
PictureLoadDlg* m_pLoadPictureDlg;
};
// 实现 .cpp
QPictureEditPage::QPictureEditPage(QWidget *parent)
: QWidget(parent)
{
m_pLoadPictureDlg= new PictureLoadDlg(this, “”);
m_pLoadPictureDlg->hide();
}
// ...
void QPictureEditPage::onBtnLoadClicked()
{
// 获取图片路径
// ... qsPicPath
if (m_pLoadPictureDlg->loadPicture(qsPicPath))
{
m_pLoadPictureDlg->show();
}
}
在调用类中调用了 m_pLoadPictureDlg->loadPicture 后 VS 编译提示错误。
警告 C4273 “qt_static_metacall”: dll 链接不一致
警告 C4273 “staticMetaObject”: dll 链接不一致
错误 C2491 “::staticMetaObject”: 不允许 dllimport 静态数据成员的定义
警告 C4273 “::metaObject”: dll 链接不一致
// 还有其他的警告,都是 dll 链接不一致