首页 > 解决方案 > Pyside6 中的 QUdpSocket 没有发出 readReady,而 QT C++ 应用程序中的等效代码运行良好

问题描述

我正在转换我在 Qt C++ 上工作的简单 Udp 客户端应用程序,但是当我尝试在 Pyside6 上实现相同的行为时,即使套接字似乎处于 ConnectedState,也不会触发 readyRead。

我正在使用 Windows 机器。

Pyside6 代码 - 未触发 readyRead

import sys

from PySide6.QtCore import QDataStream, QTimer, Qt, QObject, Signal
from PySide6.QtGui import QIntValidator
from PySide6.QtNetwork import QAbstractSocket, QUdpSocket, QHostAddress
from PySide6.QtWidgets import (QApplication, QDialog, QDialogButtonBox, QGridLayout,
                               QLabel, QLineEdit, QMessageBox, QPushButton,
                               QVBoxLayout, QWidget)

# from UdpRx import UdpConectionManager

class UdpClient(QDialog):
    def __init__(self, parent= None):
        super().__init__(parent)

        self._block_size = 0
        self._current_fortune = ''

        host_label = QLabel("&Server name:")
        port_label = QLabel("S&erver port:")

        self._host_line_edit = QLineEdit('Localhost')
        self._port_line_edit = QLineEdit()
        self._port_line_edit.setValidator(QIntValidator(1, 65535, self))

        host_label.setBuddy(self._host_line_edit)
        port_label.setBuddy(self._port_line_edit)

        self._status_label = QLabel("Data: ")


        self.hostname = "127.0.0.1"
        self.portnum = 12000

        self._udp_socket_manager = UdpConectionManager(self.hostname, self.portnum)

        self._udp_socket_manager.ProcessTheDataGram.connect(self.process_Data)

        main_layout = QGridLayout(self)
        main_layout.addWidget(self._status_label, 2, 0, 1, 2)

        self.setWindowTitle("Fortune Client")
        self._port_line_edit.setFocus()


    def process_Data(self, data):
        self._status_label.setText(data)


class UdpConectionManager(QObject):
    ProcessTheDataGram = Signal(str)
    
    def __init__(self, hostname, portnum):
        super().__init__()
        self.udp_socket_ptr = QUdpSocket(self)
        print("Making socket connection to : ", portnum)
        self.udp_socket_ptr.bind(QHostAddress(hostname), int(portnum))
        self.udp_socket_ptr.readyRead.connect(self.readPendingDataGrams)

    def readPendingDataGrams(self):
        while self.udp_socket_ptr.hasPendingDatagrams():
            datagram = self.udp_socket_ptr.receiveDatagram()
            self.ProcessTheDataGram.emit(str(datagram.data()))


if __name__ == '__main__':
    app = QApplication(sys.argv)
    client = UdpClient()
    client.show()
    sys.exit(client.exec())

当我将此例程作为 Qt C++ 应用程序执行时,我得到了结果

#include <QtNetwork/QUdpSocket>
#include <QtNetwork/QNetworkDatagram>
#include <QObject>
#include <qdebug.h>

class UdpConnectionManager : public QObject
{
    Q_OBJECT

public:
    UdpConnectionManager(QString host_name, quint16 port_number) : udp_sockter_ptr(new QUdpSocket(this))
    {
        udp_sockter_ptr->bind(QHostAddress(host_name), port_number);
        connect(udp_sockter_ptr,&QUdpSocket::readyRead,this, &UdpConnectionManager::ReadPendingDataGrams);
    }

    void ReadPendingDataGrams()
    {
        while (udp_sockter_ptr->hasPendingDatagrams()) {
            QNetworkDatagram datagram = udp_sockter_ptr->receiveDatagram();
            QString data_gram = datagram.data();
            emit ProcessTheDataGram(data_gram);
        }
    }
Q_SIGNALS:
    void ProcessTheDataGram(QString& data);


private:
    QString host_name;
    quint16 port_number;
    QUdpSocket* udp_sockter_ptr;

};

我也很惊讶没有在 Pyside6 中找到 QUdpSocket 的示例代码。

提前致谢。

标签: pythonpyside6qudpsocket

解决方案


推荐阅读