【问题标题】:Can't receive signal in qt [closed]在qt中无法接收信号[关闭]
【发布时间】: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
}

为什么收不到信号?

【问题讨论】:

  • 当您的connect 处于活动状态时......信号已经发出并消失了......您的连接不会捕捉到它。您需要考虑您的设计以避免这种不利的情况。

标签: c++ qt signals signals-slots


【解决方案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 需要知道的是,必须在发出任何类型的信号之前建立连接。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-02
    • 1970-01-01
    • 2013-06-05
    相关资源
    最近更新 更多