其他分享
首页 > 其他分享> > c – 从Qt中的静态类方法发送信号

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

作者:互联网

我试图编写一个静态回调函数,该函数经常从同一个类中的另一个静态函数调用.我的回调函数需要发出一个信号但由于某种原因它根本就没有这样做.我把它放在调试器下,插槽永远不会被调用.但是,当我放置用于在非静态函数中发出数据的代码时,它可以工作.有没有理由我不能从静态函数发出信号?我已经尝试声明类的新实例并调用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

解决方法:

这是行不通的,因为每次进入静态函数时都会创建一个新的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);
    }
};

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

标签:c,qt,static,callback,signals-slots
来源: https://codeday.me/bug/20191004/1853172.html