微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

无法将 SIGNAL 连接到同一个类中的 SLOT 以及两个不同的类 QT

如何解决无法将 SIGNAL 连接到同一个类中的 SLOT 以及两个不同的类 QT

我正在 QT5.13 下开发 QT 应用程序,并且我试图将信号与同一类的插槽连接,因为最终目标是将此类的信号与第二类的插槽连接,但它在这两种情况下都不起作用,所以我尝试在进入第二步之前在同一个类中验证它。

这是我的代码

udpserver.h :

#ifndef UDPSERVER_H
#define UDPSERVER_H

#include <QObject>
#include <QUdpSocket>
#include <QDebug>
#include <QJsonDocument>
#include <QJsonObject>
#include <QJsonArray>

class UDPServer : public QObject
{
    Q_OBJECT

public:
    explicit UDPServer(QObject *parent = nullptr);
    QUdpSocket *getSocket() const;
    void Send(QString d);
    void pMsg(QByteArray App_Msg);

signals:
    void ack_gui(QString ack_msg);

public slots:
    void readyRead();
    void ackRead(QString _ack_msg);

private:
    QUdpSocket *socket;
};

#endif // UDPSERVER_H

udpserver.cpp:

#include "udpserver.h"

UDPServer::UDPServer(QObject *parent) : QObject(parent)
{
    socket = new QUdpSocket(this);
    QTextStream(stdout) << "Socket Server created ! " << endl;
    socket->bind(QHostAddress::LocalHost,QT_SERVER_PORT);

    connect(socket,SIGNAL(readyRead()),this,SLOT(readyRead()));
    connect(socket,SIGNAL(ack_gui(QString)),SLOT(ackRead(QString)));
}

QUdpSocket *UDPServer::getSocket() const
{
   return socket;
}

void UDPServer::SendData(QString d)
{
    keyprod prod1;
    QByteArray Data;
    QJsonObject Js_command = prod1.ObjectFromString(d);
    Data.append(d);

    socket->writeDatagram(Data,QHostAddress::LocalHost,PYTHON_SERVER_PORT);
    qDebug() << "catch! " << endl;
}

void UDPServer::pMsg(QByteArray App_Msg)
{
    QJsonDocument JsonDocument = QJsonDocument::fromJson(App_Msg);
    QJsonObject JsonApp_Msg = JsonDocument.object();
    QString Typo = JsonApp_Msg["no"].toString();

    emit ack_gui(Typo);
}

void UDPServer::readyRead()
{

    QByteArray buffer;
    buffer.resize(socket->pendingDatagramSize());
    QHostAddress sender;
    quint16 senderPort;
    socket->readDatagram(buffer.data(),buffer.size(),&sender,&senderPort);
    pMsg(buffer);
}


void UDPServer::ackRead(QString _ack_msg)
{
    qDebug() << "Message : " << _ack_msg;
}

正如你所看到的,这是一个非常经典的类,在 QT 中没有很复杂,第一个连接有效,但我使用个人信号的第二个不起作用:

connect(socket,SLOT(ackRead(QString)));

代码已编译,但是当我吃午饭时,我得到了这个:

QObject::connect: No such signal QUdpSocket::ack_gui(QString) in ../../udpserver.cpp

我也在 QT5 中尝试了新的连接语法,但没有奏效。

我知道这个话题已经被提到过好几次了,但我已经检查了这些话题,但仍然没有找到解决方案,你能帮我吗。

预先感谢您的帮助

解决方法

那是因为 ack_gui 信号是您的 UDPServer 类的成员,不是 QUdpSocket

使用新的信号/槽语法...

connect(this,&UDPServer::ack_gui,this,&UDPServer::ackRead);
,
  1. 不要使用旧的信号/槽连接,使用新连接你会得到更好的编译时间警告:https://wiki.qt.io/New_Signal_Slot_Syntax

  2. 您正在将 QUdpSocket 连接到您的 UDPServer。您的 UdpServerack_gui 信号,但 QUdpSocket 没有!

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。