qt so庫回撥函式的實現
阿新 • • 發佈:2019-02-04
主要參考windows的做法,這個跟系統沒有關係,只要是C++都是一樣的
參考文章
http://blog.csdn.net/zcabcd123/article/details/8185114
so庫程式碼
#ifndef MAKE_SO_H #define MAKE_SO_H #include "make_so_global.h" class Test_SO; typedef void(*Emit)(Test_SO*, char*, int); //函式指標型別定義 class MAKE_SOSHARED_EXPORT Make_so { public: Make_so(); int add(int a,int b); void SetSignal(Test_SO *commn, Emit func); void OnReceive(); void GetData(); public: Emit emitSignal; Test_SO * pComm; //Qt中類例項的指標,指向Qt主程式中的類例項,作回撥函式的實 }; #endif // MAKE_SO_H
#include "make_so.h" Make_so::Make_so() { } int Make_so::add(int a,int b) { return a+b; } void Make_so::SetSignal(Test_SO *commn, Emit func) { emitSignal = func; //傳遞Qt主程式裡的函式(回撥函式)指標 pComm = commn; //傳遞Qt主程式裡的類例項指標 } void Make_so::GetData() { OnReceive(); } char *pDataBuffer; //接收資料快取指標 int iLength; //接收到的位元組數 void Make_so::OnReceive() //過載接收函式 { int dataLen = 10; emitSignal(pComm,pDataBuffer,dataLen); }
qt主程式
#include "test_so.h" #include "ui_test_so.h" #include "addlib/make_so.h" #include "QMessageBox" #include "QSettings" void SetIt(Test_SO *comm, char *data, int len) { qDebug("GOT DATA!"); qDebug("len=%d" ,len); comm->test1(); } Test_SO::Test_SO(QWidget *parent) : QMainWindow(parent), ui(new Ui::Test_SO) { ui->setupUi(this); } Test_SO::~Test_SO() { delete ui; } void Test_SO::on_pushButton_clicked() { qDebug("click pushbutton!"); Make_so TestAdd; TestAdd.SetSignal(this, SetIt);//設定訊號與回傳 TestAdd.GetData(); } void Test_SO::test1() { qDebug("1111111111111111111!"); }