Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/neo4j/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 在Qt中从静态类方法发送信号_C++_Qt_Static_Callback_Signals Slots - Fatal编程技术网

C++ 在Qt中从静态类方法发送信号

C++ 在Qt中从静态类方法发送信号,c++,qt,static,callback,signals-slots,C++,Qt,Static,Callback,Signals Slots,我试图编写一个静态回调函数,该函数经常从同一类中的另一个静态函数调用。我的回调函数需要发出一个信号,但由于某种原因,它根本无法发出信号。我把它放在调试器下,插槽永远不会被调用。但是,当我将用于发出数据的代码放在一个非静态函数中时,它就工作了。我不能从静态函数发出信号有什么原因吗?我曾尝试声明该类的一个新实例并调用emit函数,但没有成功 class Foo { signals: emitFunction(int); private: static int callback(int

我试图编写一个静态回调函数,该函数经常从同一类中的另一个静态函数调用。我的回调函数需要发出一个信号,但由于某种原因,它根本无法发出信号。我把它放在调试器下,
插槽
永远不会被调用。但是,当我将用于发出数据的代码放在一个非静态函数中时,它就工作了。我不能从静态函数发出信号有什么原因吗?我曾尝试声明该类的一个新实例并调用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);
    }
};
我已经发布了一些基本代码来演示我正在尝试做的事情。我会根据要求发布完整的代码


编辑:我张贴完整的代码,因为这是一种奇怪的情况

这是行不通的,因为每次输入静态函数时都要创建一个新的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);
    }
};
另一个选择是使用,但我不推荐


由于您不能修改回调的签名,因此可以这样做:

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);
    }
};

但是您必须在某个地方初始化该静态变量。

您必须提供一个指向类实例的指针才能使其工作

但是请注意,一般不建议从静态函数发出信号。可以在不创建类实例的情况下调用静态函数,这意味着(如果您不提供发送方作为参数并明确使用它),您将不会有用于发出信号的“发送方”对象


对于Lol4t0建议的这些情况,我也更喜欢回调

如果有人仍在寻找解决方案,这就是我所做的,它在我的项目中起作用。 1.让你的班级成为独生子女 2.在静态cb函数中,从singleton类的

    static int callback(int val)
   {
   /* Called multiple times (100+) */
   MYClass::getInstance()->emitFunction(val);
   }

有一个优雅的解决方案。您可以在静态成员函数中发出如下信号:

emit (instance().newMessage(message));

您将信号和插槽连接到何处?我将它们连接到一个单独的
.cpp
文件中,该文件通过按键调用<代码>无效主窗口::在按钮上单击(){tProc=new Foo(此);连接(tProc,SIGNAL(ValChanged(int)),此,插槽(onNumberChanged(int));tProc->start();}然后它创建my
Foo
类的新实例,并启动调用回调函数的线程。在静态回调函数中,您创建一个新的Foo实例并调用其上的信号。我想这就是你想要发出信号的点。如何将此实例连接到要寻址的插槽?我不完全确定您的意思,但我假设我在
main window::on_button_clicked()
函数中正确连接了它。我需要在静态函数中以某种方式重新连接它吗?在
单击的
函数中,您将插槽连接到
一个
Foo
,但在
回调中,您创建了另一个单独的
Foo
,它首先对
一无所知。您会发出这个新的
Foo
的信号,但是新的
Foo
的信号没有连接到任何插槽。这会起作用,但问题是我的静态回调函数正被libCURL库中的另一个函数调用,我无法向它传递参数。我不知道在这种情况下如何实现您的方法。@user99545添加一个静态变量,该变量在回调中使用。我会编辑答案谢谢。最后我使用了静态变量,并通过将当前类实例作为参数传递给线程来初始化它。我用这个参数初始化了这个类,它成功了。非常感谢!我浪费了几个小时试图让它工作,你的第二个建议太棒了@我尝试了第二种方法,但当我想在contractor中初始化它时,它显示了对'Foo::theFoo'的未定义引用。这种方法很好而且简单,因为信号发射是线程安全的+1.