我正在尝试编写一个静态回调函数,该函数经常从同一个类中的另一个静态函数调用。我的回调函数需要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);
}
};
我发布了一些基本代码,用于演示我尝试做的事情。我会根据要求发布完整的代码。
编辑:我发布了完整的代码,因为这是一种奇怪的情况。 http://pastebin.com/6J2D2hnM
答案 0 :(得分:11)
这不会起作用,因为每次进入静态功能时都会创建一个新的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);
}
};
另一个选择是使用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);
}
};
但你必须在某处初始化那个静态变量。
答案 1 :(得分:2)
如果有人仍在寻找解决方案,这就是我所做的,它适用于我的项目。 1.让你的班级成为一个单身人士 2.在静态cb函数中,从你的单例类加载emitFunction
static int callback(int val)
{
/* Called multiple times (100+) */
MYClass::getInstance()->emitFunction(val);
}
答案 2 :(得分:1)
有一个优雅的解决方案。您可以像这样在静态成员函数中发出信号:
id age block trial condition accuracy cumulative
1 1 1 1 1 0 NA
1 1 1 2 1 0 NA
1 1 2 1 1 0 1
1 1 2 2 1 0 2
1 1 2 3 1 0 3
1 1 2 4 2 0 NA
1 1 2 5 1 0 4
1 1 2 6 1 1 0
1 1 2 7 1 0 1
1 1 2 8 1 0 2
1 2 2 1 1 0 1
答案 3 :(得分:0)
您必须提供指向类实例的指针才能使其正常工作。
但请注意,通常不建议从静态函数发出信号。可以在不创建类的实例的情况下调用静态函数,这意味着(如果您不提供发送方作为参数并明确使用它),则不会为发出的信号设置“发送方”对象。
对于这些情况,因为Lol4t0表明我也更喜欢回调。