1、问题:
最近遇到纯C、c++回调Qt的函数问题,并且在Qt的线程里注册,第一次看见这样用,貌似问题不大,但是也有值得怀疑和不稳定的地方。但是暂时还不能断言这种使用方法有问题,写出来作为经验总结,也供大家互相学习和讨论。
值得注意的是,在线程注册回调函数的时候传的参数是函数体。
2、相关帖子和博文:
如何让外部纯C函数与Qt通信
http://bbs.csdn.net/topics/390278368?page=1
我现在的办法是提供一个callback函数和一个文件域的void* 指针
callback()
{
b::up(void* pt)// static;
}
在 b::static void up(void* pt)
{
b * pt_ = (b *) pt;
emit pt_->signal();
}
---------------------------------------------------------------------------------------
widget.h
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
|
#ifndef WIDGET_H
#define WIDGET_H
#include <QtGui>
#include <QtCore>
class
Widget :
public
QWidget
{
Q_OBJECT
public
:
Widget();
static
Widget *Instance();
static
Widget *widget;
void
emit_signal();
public
slots:
void
create();
void
use_fun();
signals:
void
create_label();
};
#endif
|
widget.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
|
#include "widget.h"
static
void
show_new_label()
{
qDebug() <<
"in static fun\n"
;
Widget *w = Widget::Instance();
w->emit_signal();
//return;
}
Widget::Widget()
{
QPushButton *button =
new
QPushButton(
"button"
,
this
);
connect(button, SIGNAL(clicked()),
this
, SLOT(use_fun()));
connect(
this
, SIGNAL(create_label()),
this
, SLOT(create()));
resize(400,400);
}
Widget *Widget::widget = NULL;
Widget *Widget::Instance()
{
if
(widget == NULL)
{
widget =
new
Widget;
}
return
widget;
}
void
Widget::emit_signal()
{
qDebug() <<
"emit signal"
;
emit create_label();
}
void
Widget::use_fun()
{
show_new_label();
}
void
Widget::create()
{
QLabel *label =
new
QLabel(
this
);
label->setText(
"this is a new label"
);
label->resize(100,100);
label->move(100,100);
label->show();
}
|