前言:從上個月底因為新項目統一平台需要用Qt開發,就開始研究Qt,但是一直感覺沒有入門,不知道為什么,很多功能實現了,但是知其然不知其所以然,就像現在設計的項目
使用插件進行開發,做軟件開發大體都知道什么事插件式開發,以前c#也用過,但是Qt插件開發還是第一次,百度了很久終於實現,這里記錄下!這里不講原理直接講過程,高手繞行。。。
第一部分
建立插件程序實現2個功能
(1)創建一個加法函數供主程序進行動態調用
(2)創建一個查詢頁面供主程序進行動態調用
第一步創建插件程序
打開文件菜單-》新建文件或項目-》選擇other project -》C++庫如圖
點擊Choose進入如圖
選擇共享庫-》輸入名稱-》選擇你工程位置
點擊下一步選擇工程需要模塊點擊下一步完成
完成后你會發現工程有2個頭文件和一個源文件
這里點擊新建文件添加一個新建文件
新建文件-》Qt-》Qt設計類-》選擇dialog-》輸入名稱
如圖
頭文件
MYTESTDLL_GLOBAL_H

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
源文件


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