在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::ClientConnected
和Client::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 信号槽连接中删除参数的文档在哪里?