c++ - 在静态函数中发出信号

标签 c++ qt signals emit

我有一个静态函数:static void lancerServeur(std::atomic<bool>& boolServer) ,这个函数是强制静态的,因为我在一个线程中启动它,但是由于这个原因,我不能在这个函数中发出信号。这是我尝试做的事情:

void MainWindow::lancerServeur(std::atomic<bool>& boolServer){
    serveur s;
    StructureSupervision::T_StructureSupervision* bufferStructureRecu;
    while(boolServer){
        bufferStructureRecu = s.receiveDataUDP();
        if(bufferStructureRecu->SystemData._statutGroundFlight != 0){
            emit this->signal_TrameRecu(bufferStructureRecu);//IMPOSSIBLE TO DO
        }
    }
}

有没有办法发出我的信号?

谢谢。

最佳答案

您可以在 MainWindow 类中保留一个指向 MainWindow 实例的静态指针,并在构造函数中对其进行初始化。然后您可以使用该指针从静态函数调用 emit。

class MainWindow : public QMainWindow
{
    ...
    private:
        static MainWindow* m_psMainWindow;

        void emit_signal_TrameRecu(StructureSupervision::T_StructureSupervision* ptr)
        {
            emit signal_TrameRecup(ptr);
        }
};

// Implementation

// init static ptr
MainWindow* MainWindow::m_psMainWindow = nullptr; // C++ 11 nullptr

MainWindow::MainWindow(QWidget* parent)
    : QMainWindow(parent)
{
    m_psMainWindow = this;
}


void MainWindow::lancerServeur(std::atomic<bool>& boolServer)
{
    StructureSupervision::T_StructureSupervision* bufferStructureRecu;

    ...

    if(m_psMainWindow)
        m_psMainWindow->emit_signal_TrameRecu( bufferStructureRecu );
}

关于c++ - 在静态函数中发出信号,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24484961/

相关文章:

c++ - 使用类型转换创建对 unique_ptr 中对象的引用

c++ - 包含 Qt 头文件的正确方法是什么?

c++ - 如何将 std::string 转换为 QString

node.js - 如何从另一个 Node.js 程序向 Heroku 上的 PostgREST 发送 SIGHUP 信号?

c++ - 将字符串中的每个字符转换为 ASCII

C++元编程递归步数限制

c++ - WinbioOpensession 返回 E_ACCESSDENIED?

c++ - 将项目从QTreeWidget拖动到QGraphicsView

objective-c - 您对通知和委托(delegate)的替代方案的看法 : Signals?

c++ - 取消信号处理程序内的线程