在qt中无法接收信号[关闭]

Posted

技术标签:

【中文标题】在qt中无法接收信号[关闭]【英文标题】:Can't receive signal in qt [closed] 【发布时间】:2018-06-06 00:10:24 【问题描述】:

我已将 Client 类的插槽连接到 ClientNetwork 类的信号,但它不起作用

客户端类:

Client::Client(QString &ip, quint16 port)

    clientNetwork = new ClientNetwork(ip,port);
    connect(clientNetwork, &ClientNetwork::clientConnected, this, &Client::connected); 

void Client::connected()

    qDebug()<<"clientConnected signal received"; //This qDebug is not showing

和ClientNetwork类:

ClientNetwork::ClientNetwork(QString &hostIp, quint16 hostPort)
    : port(hostPort), ip(hostIp)

    ................
    ...code.........
    ................

    emit clientConnected(); // emit signal
    qDebug()<<"Client::clientConnected"; // this qDebug is showing

为什么收不到信号?

【问题讨论】:

Why emit signal in constructor doesnt work?的可能重复 当您的connect 处于活动状态时......信号已经发出并消失了......您的连接不会捕捉到它。您需要考虑您的设计以避免这种不利的情况。 【参考方案1】:

在将 Client 连接到 ClientNetwork 之前,您正在发出信号 clientConnected()。 您可以通过在发出任何 clientConnected() 信号之前在 ClientNetwork Construct 上建立连接并通过将 Client 指针或引用传递给 ClientNetwork 构造函数来解决此问题,但我不建议这样做。

最好的方法是从构造函数中删除所有连接处理,并在您的 ClientNetwork 类中创建一个“连接”方法,您将在客户端类上连接信号/插槽后调用它:

Client::Client(QString &ip, quint16 port)

  clientNetwork = new ClientNetwork(ip,port);
  connect(clientNetwork, &ClientNetwork::clientConnected, this, &Client::connected); 
  clientNetwork->connect();

【讨论】:

【参考方案2】:

class Client 的构造函数被调用时,它首先创建一个ClientNetwork,您已经在其中发出信号clientConnected,然后才建立ClientNetwork::ClientConnectedClient::connected 之间的连接。

所以基本上问题是发出信号时,信号和槽之间没有建立没有连接

如果clientConnected() 是公共信号,那么你可以在Client 的构造函数中执行以下操作:

Client::Client(QString &ip, quint16 port)

   clientNetwork = new ClientNetwork(ip,port);
   connect(clientNetwork, &ClientNetwork::clientConnected, this, &Client::connected);
   emit clientNetwork->clientConnected();
   //or call a public method of Client which does that for you depending on your design.

【讨论】:

问题得到了很好的解释,但修复很脏,因为无论连接成功失败,都会发送 clientConnected() 信号。 是的,理想情况下,它应该只在建立正确连接时发出,其逻辑可能位于ClientNetwork 的某个地方。 OP 需要知道的是,必须在发出任何类型的信号之前建立连接。

以上是关于在qt中无法接收信号[关闭]的主要内容,如果未能解决你的问题,请参考以下文章

如果参数不是从末尾开始,则说明您无法从 QT 信号槽连接中删除参数的文档在哪里?

无法在 Qt 中退出 exec 循环

QT遇到Release事件无法正常接收的情况怎么办

使用 qt 中的信号/插槽更新 gui [关闭]

无法连接来自 QApplication 的 aboutToQuit 信号

是否隐藏 QWidget 对象接收信号