【问题标题】:Can't connect SIGNAL to SLOT in same classe and also two differents classes QT无法将 SIGNAL 连接到同一类的 SLOT 以及两个不同的类 QT
【发布时间】:2021-04-24 16:39:17
【问题描述】:

我正在 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)), this, 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, SIGNAL(ack_gui(QString)), this, SLOT(ackRead(QString)));

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

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

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

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

提前感谢您的帮助

【问题讨论】:

    标签: c++ qt qt5 signals-slots


    【解决方案1】:

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

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

    connect(this, &UDPServer::ack_gui, this, &UDPServer::ackRead);
    

    【讨论】:

      【解决方案2】:
      1. 不要使用旧的信号/插槽连接,使用新的连接会得到更好的编译时警告:https://wiki.qt.io/New_Signal_Slot_Syntax

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

      【讨论】:

      • 感谢您的回复,但我可以使用新语法输入参数。我应该在我的 UdpServer 类中做什么?
      • 是的,完美!!谢谢 !那么我应该如何从我的 mainwindows 类中调用 UDPServer 呢?使用主窗口的插槽!
      • "从我的主窗口类调用 UDPServer?使用主窗口插槽!"这是你应该做的另一种方式。 “调用 UDP 服务器”是通过将信号(例如,来自您的主窗口)连接到 UDP 服务器来完成的。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-06-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多