【发布时间】:2012-03-13 17:54:48
【问题描述】:
我正在尝试编写一个静态回调函数,该函数经常从同一类中的另一个静态函数调用。我的回调函数需要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
【问题讨论】:
-
信号和插槽在哪里连接?
-
我将它们连接到一个单独的
.cpp文件中,该文件在按下按钮时被调用。void MainWindow::on_pushButton_clicked() { tProc = new Foo(this); connect(tProc, SIGNAL(ValChanged(int)), this, SLOT(onNumberChanged(int))); tProc->start(); }然后创建我的Foo类的新实例并启动调用回调函数的线程。 -
在您的静态回调函数中,您创建一个新的 Foo 实例并在其上调用信号。我想这是你想要发出信号的地方。您如何将此实例连接到您要寻址的插槽?
-
我不完全确定你的意思,但我假设我在
MainWindow::on_pushButton_clicked()函数中正确连接了它。我需要以某种方式在静态函数中重新连接它吗? -
在
clicked函数中,您将插槽连接到oneFoo,但在callback中,您创建了另一个单独的Foo,它对firstfoo 一无所知。然后你发出这个新的Foo的信号,但是新的Foo的信号没有连接到任何插槽。
标签: c++ qt static callback signals-slots