Qt 一步一步实现dll调用(附源码)

简介:

前言:从上个月底因为新项目统一平台需要用Qt开发,就开始研究Qt,但是一直感觉没有入门,不知道为什么,很多功能实现了,但是知其然不知其所以然,就像现在设计的项目

使用插件进行开发,做软件开发大体都知道什么事插件式开发,以前c#也用过,但是Qt插件开发还是第一次,百度了很久终于实现,这里记录下!这里不讲原理直接讲过程,高手绕行。。。

第一部分

建立插件程序实现2个功能

(1)创建一个加法函数供主程序进行动态调用

(2)创建一个查询页面供主程序进行动态调用

第一步创建插件程序

打开文件菜单-》新建文件或项目-》选择other project -》C++库如图

点击Choose进入如图

 

选择共享库-》输入名称-》选择你工程位置

 

点击下一步选择工程需要模块点击下一步完成

完成后你会发现工程有2个头文件和一个源文件

这里点击新建文件添加一个新建文件

新建文件-》Qt-》Qt设计类-》选择dialog-》输入名称

如图

头文件

MYTESTDLL_GLOBAL_H

View Code

MYSHOWTEST_H

复制代码
#ifndef MYSHOWTEST_H
#define MYSHOWTEST_H

#include <QDialog>

namespace Ui {
    class MyShowTest;
}

class MyShowTest : public QDialog
{
    Q_OBJECT

public:
    explicit MyShowTest(QWidget *parent = 0);
    ~MyShowTest();

private:
    Ui::MyShowTest *ui;
};

#endif // MYSHOWTEST_H
复制代码

MYTESTDLL_H

复制代码
#ifndef MYTESTDLL_H
#define MYTESTDLL_H

#include "MyTestDll_global.h"
#include "qdialog.h"
class MYTESTDLLSHARED_EXPORT MyTestDll {
public:
    MyTestDll();
};
extern "C" Q_DECL_EXPORT int add(int a,int b);
extern "C" Q_DECL_EXPORT QDialog *showDialog();
#endif // MYTESTDLL_H
复制代码

源文件
MyShowTest.cpp

复制代码
#include "myshowtest.h"
#include "ui_myshowtest.h"

MyShowTest::MyShowTest(QWidget *parent) :
    QDialog(parent),
    ui(new Ui::MyShowTest)
{
    ui->setupUi(this);
}

MyShowTest::~MyShowTest()
{
    delete ui;
}
复制代码

MyTestDll.cpp

复制代码
#include "mytestdll.h"
#include "MyShowTest.h"

MyTestDll::MyTestDll()
{
}
int add(int a,int b)
{
  return a+b;
}
QDialog *showDialog()
{
    MyShowTest *ss=new MyShowTest();
    return ss;
}
复制代码

ui

点击构建项目完成插件。

第二部分

新建一个主程序如图

把生成的插件mytestdll.dll放入mytest.exe相同目录

头文件

复制代码
#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>

namespace Ui {
    class MainWindow;
}

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    explicit MainWindow(QWidget *parent = 0);
    ~MainWindow();

private:
    Ui::MainWindow *ui;

private slots:
    void on_pushButton_2_clicked();
    void on_pushButton_clicked();
};

#endif // MAINWINDOW_H
复制代码

源文件

View Code
复制代码
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include "qlibrary.h"
#include "qmessagebox.h"
#include "string.h"

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
}

MainWindow::~MainWindow()
{
    delete ui;
}
typedef int (*Fun)(int,int); //定义函数指针,以备调用
void MainWindow::on_pushButton_clicked()
{
   QLibrary mylib("MyTestDll.dll");   //声明所用到的dll文件
   int result;
   QString sresult;
   if (mylib.load())              //判断是否正确加载
   {
       Fun open=(Fun)mylib.resolve("add");    //援引 add() 函数
       if (open)                  //是否成功连接上 add() 函数
       {
            int s1=this->ui->lineEdit->text().toInt();
            int s2=this->ui->lineEdit_2->text().toInt();
            result=open(s1,s2);      //这里函数指针调用dll中的 add() 函数
            sresult=QString::number(result);
            this->ui->lineEdit_3->setText(sresult);
       }
   }
   else
   {
       QMessageBox::information(NULL,"NO","DLL is not loaded!");
   }

}
typedef QDialog *(*Funs)(); //定义函数指针,以备调用
void MainWindow::on_pushButton_2_clicked()
{
   //加载插件
   QLibrary mylib("MyTestDll.dll");   //声明所用到的dll文件
   if (mylib.load())              //判断是否正确加载
   {
       Funs open=(Funs)mylib.resolve("showDialog");    //援引 add() 函数
       if (open)                  //是否成功连接上 add() 函数
       {
           QDialog *form1= open();
           form1->show();
        }
    }
}
复制代码


效果如图

完成预定2个功能

源码下载:http://download.csdn.net/detail/huangyuancao/5023059



本文转自夜&枫博客园博客,原文链接:http://www.cnblogs.com/newstart/archive/2013/01/23/2873611.html,如需转载请自行联系原作者




相关文章
|
C++ Python
Qt+C++桌面计算器源码
Qt+C++桌面计算器源码
167 0
Qt+C++桌面计算器源码
|
3月前
|
编解码 开发工具 UED
QT Widgets模块源码解析与实践
【9月更文挑战第20天】Qt Widgets 模块是 Qt 开发中至关重要的部分,提供了丰富的 GUI 组件,如按钮、文本框等,并支持布局管理、事件处理和窗口管理。这些组件基于信号与槽机制,实现灵活交互。通过对源码的解析及实践应用,可深入了解其类结构、布局管理和事件处理机制,掌握创建复杂 UI 界面的方法,提升开发效率和用户体验。
203 13
|
3月前
|
Windows
QT源码拾贝6-11(qwindowswindow)
这篇文章深入探讨了Qt源码中与窗口激活相关的函数,QDebug运算符重载,vscode的变量提示,Windows常用类型名,获取所有窗体的方法,以及QSharedPointer智能指针的使用。
QT源码拾贝6-11(qwindowswindow)
|
3月前
|
存储 Java C++
QT源码拾贝0-5(qimage和qpainter)
这篇文章介绍了在Qt源码中qimage和qpainter的使用,包括线程池的使用、智能指针的存储、std::exchange函数的应用、获取类对象的方法以及QChar字节操作。
QT源码拾贝0-5(qimage和qpainter)
|
4月前
|
存储 C++
【C++】C++ 基于QT实现散列表学生管理系统(源码+数据+课程论文)【独一无二】
【C++】C++ 基于QT实现散列表学生管理系统(源码+数据+课程论文)【独一无二】
112 1
【C++】C++ 基于QT实现散列表学生管理系统(源码+数据+课程论文)【独一无二】
|
4月前
|
存储 算法 C++
【C++】C++ QT实现Huffman编码器与解码器(源码+课程论文+文件)【独一无二】
【C++】C++ QT实现Huffman编码器与解码器(源码+课程论文+文件)【独一无二】
124 4
|
4月前
QT6使用CMamke将qml打包成dll
QT6使用CMamke将qml打包成dll
98 0
|
4月前
从源码角度分析Qt元对象系统2
从源码角度分析Qt元对象系统
61 0
|
4月前
|
存储
从源码角度分析Qt元对象系统1
从源码角度分析Qt元对象系统
89 0
|
4月前
|
存储 C++
【C++】C++ QT实现 学生信息管理系统(QT源码)【独一无二】
【C++】C++ QT实现 学生信息管理系统(QT源码)【独一无二】
164 0