use*_*545 12 c++ qt static callback signals-slots
我试图编写一个静态回调函数,该函数经常从同一个类中的另一个静态函数调用.我的回调函数需要emit一个信号,但由于某种原因,它根本就没有这样做.我把它放在一个调试器下,slot永远不会被调用.但是,当我将用于emit数据的代码放在非静态函数中时,它可以工作.有没有理由我不能从静态函数发出信号?我已经尝试声明类的新实例并调用emit函数但没有运气.
class Foo
{
signals:
emitFunction(int);
private:
static int callback(int val)
{
/* Called multiple times (100+) */
Foo *foo = new Foo;
foo.emitFunction(val);
}
void run()
{
callback(percentdownloaded);
}
};
Run Code Online (Sandbox Code Playgroud)
我已经发布了一些基本代码来演示我试图做的事情.我会根据要求发布完整的代码.
编辑:我发布完整的代码,因为这是一种奇怪的情况.http://pastebin.com/6J2D2hnM
BЈо*_*вић 12
这是行不通的,因为每次进入静态函数时都会创建一个新的Foo,而不是将信号连接到插槽.
因此,修复方法是将对象传递给该函数:
class Foo
{
signals:
emitFunction(int);
private:
static int callback(int val, Foo &foo)
{
/* Called multiple times (100+) */
foo.emitFunction(val);
}
void run()
{
callback(percentdownloaded, *this);
}
};
Run Code Online (Sandbox Code Playgroud)
另一种选择是使用postEvent,但我不推荐它.
由于您无法修改回调的签名,您可以这样做:
class Foo
{
signals:
emitFunction(int);
private:
static int callback(int val)
{
/* Called multiple times (100+) */
theFoo->emitFunction(val);
}
static Foo *theFoo;
void run()
{
callback(percentdownloaded, *this);
}
};
Run Code Online (Sandbox Code Playgroud)
但你必须在某处初始化那个静态变量.