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

时间:2012-02-23 10:26:49

标签: 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);
    }
};

我发布了一些基本代码,用于演示我尝试做的事情。我会根据要求发布完整的代码。

编辑:我发布了完整的代码,因为这是一种奇怪的情况。 http://pastebin.com/6J2D2hnM

4 个答案:

答案 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表明我也更喜欢回调。