在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指针。