从Qt中的静态类方法发送信号

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)

但你必须在某处初始化那个静态变量.