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


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

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

    第一部分

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

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

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

    第一步创建插件程序

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

    点击Choose进入如图

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

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

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

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

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

    如图

    头文件

    MYTESTDLL_GLOBAL_H

    View Code

    MYSHOWTEST_H

    View Code
    #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

    View Code
    #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

    View Code
    #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

    View Code
    #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相同目录

    头文件

    View Code
    #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
    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

    ps:博客园怎么提供源码下载呢。。。

  • 相关阅读:
    pytorch实现yolov3(1) yolov3基本原理
    python随机选取目录下的若干个文件
    转 Yolov3转化Caffe框架详解
    特征金字塔网络Feature Pyramid Networks
    基于区域的目标检测
    聚类kmeans算法在yolov3中的应用
    车位iou计算
    git常用命令
    opencv 图像旋转
    简单的选项卡制作
  • 原文地址:https://www.cnblogs.com/newstart/p/2873611.html
Copyright © 2020-2023  润新知