版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/kidults/article/details/86595694
- 编译步骤
新建工程
首先说明一点,我要新建的动态库的功能是:弹出一个模式对话框。
新建好的工程文件目录如下:
接下来,modaldialog_global.h 文件的内容不要改。
把 modaldialog.h 文件的以下部分
class MODALDIALOGSHARED_EXPORT ModalDialog
{
public:
ModalDialog();
};
修改为下面的内容
#ifndef MODALDIALOG_H
#define MODALDIALOG_H
#include "modaldialog_global.h"
#include <QDialog>
#include <QLabel>
#include <QMovie>
//动态库需要的变量
QDialog *m_pDialog;
QLabel *m_pText;
QMovie *m_pMovie;
QLabel *m_pLogo;
bool isGif = false;
//下面的就是动态库的接口
extern "C" Q_DECL_EXPORT void InitDlg(int x, int y);
extern "C" Q_DECL_EXPORT void OpenDlg(QString logoPath,QString textStr);
extern "C" Q_DECL_EXPORT void CloseDlg();
#endif // MODALDIALOG_H
把 modaldialog.cpp 文件的以下内容
ModalDialog::ModalDialog()
{
}
修改为
#include "modaldialog.h"
#include <QFont>
//初始化模式对话框,参数为对话框的位置
void InitDlg(int x, int y)
{
m_pDialog = new QDialog();
m_pDialog->setWindowFlags(Qt::FramelessWindowHint);
m_pDialog->setAttribute(Qt::WA_TranslucentBackground);
m_pDialog->move(x,y);
m_pDialog->resize(600,400);
QFrame *frame = new QFrame(m_pDialog);
frame->move(0,125);
frame->resize(600,275);
frame->setStyleSheet("QFrame{border-radius:15px;background-color: white}"); // rgb(55, 135, 215);
m_pText = new QLabel(frame);
m_pText->setAlignment(Qt::AlignHCenter | Qt::AlignCenter);
m_pText->resize(600,100);
m_pText->move(0,120);
QFont font;
font.setFamily("SimSun");
font.setPointSize(35);
m_pText->setFont(font);
m_pLogo = new QLabel(m_pDialog);
m_pMovie = new QMovie();
m_pLogo->move(175,0);
m_pLogo->resize(250,250);
}
//打开模式对话框,参数一,对话框的logo图路径(gif 或 png格式(250X250大小)),参数二,会话框的文本
void OpenDlg(QString logoPath,QString textStr)
{
CloseDlg();
if(logoPath.contains("png")){
QPixmap pixmap(logoPath);
m_pLogo->setPixmap(pixmap);
isGif = false;
}else if(logoPath.contains("gif")){
isGif = true;
m_pMovie->setFileName(logoPath);
m_pLogo->setMovie(m_pMovie);
m_pMovie->start();
}else{
isGif = false;
return;
}
m_pText->setText(textStr);
m_pDialog->exec();
}
//关闭模式对话框
void CloseDlg()
{
if(isGif)
m_pMovie->stop();
m_pDialog->close();
}
编译,就会在相关目录下生成以下三个文件
隐式调用
新建一个工程
把ModalDialog.dll拷贝到指定目录,并在pro中包含
注:如果是进行程序打包,最好是用$$PWD(相对路径)的方式包含
LIBS += -LE:/ -lModalDialog
把modaldialog_global.h , modaldialog.h 拷贝到当前工程目录,并在调用接口的文件中包含进来
#include "modaldialog.h"
调用接口:
InitDlg(500,20);
OpenDlg("E:/ok.png","登录成功");
现在回过头来,说一下为什么要将之前生成的类删除?
如果动态库中封装的是类的方式,那么,在调用接口时,必须先定义一个类对象,通过对象才能调用类中的方法,即:
ModalDialog dialog;
dialog.InitDlg(500,20);
dialog.OpenDlg("E:/ok.png","登录成功");
如果库的方法要在多个地方调用,这样是很不方便的。
但是,如果必须是在类中封装,也可。
显式调用
显式调用,不需要包含头文件,只需要dll文件,也不需要修改pro
将dll拷贝到当前工程exe所在目录
QLibrary myLib("ModalDialog.dll");
if(!myLib.load()){
qDebug()<<"load dll error ";
return;
}
typedef void (*lpInitDlg)(int,int);
typedef void (*lpOpenDlg)(QString,QString);
typedef void (*lpCloseDlg)();
lpInitDlg InitDlg = (lpInitDlg)myLib.resolve("InitDlg");
lpOpenDlg OpenDlg = (lpOpenDlg)myLib.resolve("OpenDlg");
lpCloseDlg CloseDlg = (lpCloseDlg)myLib.resolve("CloseDlg");
if(!InitDlg){
qDebug()<<"InitDlg is null ";
return;
}
if(!OpenDlg){
qDebug()<<"OpenDlg is null ";
return;
}
if(!CloseDlg){
qDebug()<<"CloseDlg is null ";
return;
}
InitDlg(500,20);
OpenDlg("E:/ok.png","登录成功");