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:博客園怎么提供源碼下載呢。。。

 

 

 

 

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM