【问题标题】:Qt | C++ connect not being triggeredQt |未触发 C++ 连接
【发布时间】:2021-05-19 14:49:31
【问题描述】:

我正在尝试使用 C++ 中的基本信号/插槽。

这是我的 Network-Manager,它将触发事件:

class NetworkManager : public QObject {
Q_OBJECT
public:
    explicit NetworkManager(QApplication* application);
    void OnFinished(QNetworkReply *reply);
    ...
signals:
    void OnReceived();
};

而在Display-Manager中,这个类会接收到事件:

class DisplayManager : public QObject{
Q_OBJECT
public:
    explicit DisplayManager(QApplication *app);
    void ChangeWallPaper();
public slots:
    void ReceiveData();
};

我正在尝试从另一个班级进行连接:


Manager::Manager(QApplication *application, NetworkManager networkManager, DisplayManager displayManager)
: networkManager(application),displayManager(application) {
    ...
    connect(&networkManager, &NetworkManager::OnReceived, &displayManager, &DisplayManager::ReceiveData);
}

在这些类的实现中:

void DisplayManager::ReceiveData() {
    std::cout << "being called" << std::endl;// to check if this is being called
}

void NetworkManager::OnFinished(QNetworkReply *reply) {
    OnReceived(); // to trigger
}
// OnReceived() not implemented as it just a signal

我在这里缺少什么,为什么 ReceiveData 没有被调用?

【问题讨论】:

    标签: c++ qt connect signals-slots


    【解决方案1】:

    考虑您的 Manager 构造函数...

    Manager::Manager(QApplication *application,
                     NetworkManager networkManager,
                     DisplayManager displayManager)
        : networkManager(application)
        , displayManager(application)
    {
        ...
        connect(&networkManager, &NetworkManager::OnReceived,
                &displayManager, &DisplayManager::ReceiveData);
    }
    

    您将本地范围变量networkManagerdisplayManager 的地址传递给connect。当构造函数完成时,一旦这些临时变量超出范围,连接就会被销毁。

    尝试通过引用或指针传递networkManagerdisplayManager

    【讨论】:

    • 我将它们作为指针传递,但它们不起作用..你粘贴了我的代码,只是做了一些缩进
    • 抱歉,我不明白您的最后评论。在您为类Manager 提供构造函数的代码中,通过 接受NetworkManagerDisplayManager。也许您可以显示Manager 的类定义。
    • @MaifeeUlAsad 您确定您问题中的代码是 real 代码吗?再看一遍,如果NetworkManagerDisplayManagerQObject 继承,应该不可能通过值传递。
    • 是的,这是真正的代码您的解决方案不起作用您刚刚复制粘贴了我的带有缩进的代码。你能说出我发布的代码和你做的代码有什么区别,除了缩进部分吗?
    • 我将您的代码粘贴到我的答案中,以便为我认为的问题提供一些上下文。但是,如果NetworkManagerDisplayManager 的类定义如图所示,那么我看不到提供的Manager 代码甚至可以编译。再次,请展示Manager 的类定义并展示您如何使用它。更好的是,提供minimal reproducible example
    【解决方案2】:

    这里是the solution

    Manager::Manager(QApplication *application,
                     NetworkManager _networkManager,
                     DisplayManager _displayManager)
            : networkManager(application)
            , displayManager(application)
    {
        ...
        connect(&networkManager, &NetworkManager::OnReceived,
                &displayManager, &DisplayManager::ReceiveData);
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-04-08
      • 1970-01-01
      • 2020-08-29
      • 2020-09-25
      • 1970-01-01
      相关资源
      最近更新 更多