当前位置: 代码迷 >> QT开发 >> 请问一下用QT调用动态链接库,回调函数如何用
  详细解决方案

请问一下用QT调用动态链接库,回调函数如何用

热度:21   发布时间:2016-04-25 04:50:19.0
请教一下用QT调用动态链接库,回调函数怎么用
在mainwindow里面调用动态库,动态库有一个回调函数,就是动态库收到数据以后通过回调函数把数据传给我,这个回调函数要怎么调用mainwindow里面的函数,让回调函数一接收到数据,我就可以立刻处理?

C/C++ code
void  __stdcall  display(char *msg, int len){     int i;     QString str;     str="";        for(i =0; i<len; ++i)        {            QByteArray ba;            ba.resize(len);            ba[i]=msg[i];            str=str+QString::number(ba[i], 16).toUpper()+" ";        }        //QMessageBox msgBox;        //msgBox.setText("str");        //msgBox.exec();        return;}


这个回调函数里面没法直接调用mainwindow里面的函数,也没法用messagebox

请教一下该怎么做才能调用mainwindow里的函数

------解决方案--------------------
没怎么看明白, 但似乎不行的吧. 从逻辑上不通. 回调函数是在动态库里, 并不能确定外部是由谁来调用(就是说有没有mainwindow都是不一定的), 怎么能调用外部的函数呢?
------解决方案--------------------
mainWindow是不是真正的GUI Thread
你这么做是不行的 GUI thread一定不能处理别的线程的东西 否则crash
你可以在回调函数里保存一个指向mainWidget的指针
当进入回调后 调用mainWidget的一个方法 在这方法里产生signal 然后由对应的GUI slot处理
------解决方案--------------------
void __stdcall display(char *msg, int len)
{
mainwidget->call_signal_display(...);
}


class mainWidget :public QMainWindow
{
public:
void call_signal_display(..);
slot:
void slot_display(...)
}


------解决方案--------------------
其实 我刚才那么说有不对的地方
正确的说法 是QtGUI是必须在一个线程内的
我感觉你那个回调函数 感觉是多线程的回调 
所以你还是用signal slot去处理显示
------解决方案--------------------
回调函数要调用的函数应该是全局函数,不应该是mainwindow的成员。在注册回调的时候把mainwindow指针传进去,但由于gui thread原因,应该是不能够直接用该指针操作界面的,用signal试试吧。
------解决方案--------------------
在回调函数的处理函数里面emit (mainwindows*)param->signal

param为传递给dll的mainwindow指针。
  相关解决方案