Qt 动态库的编译和调用

版权声明:本文为博主原创文章,未经博主允许不得转载。 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","登录成功");

猜你喜欢

转载自blog.csdn.net/kidults/article/details/86595694
今日推荐