python - 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 的示例代码。
提前致谢。
解决方案
推荐阅读
- php - 使用php将数组附加到redis中的现有键
- python - How to load iframe in Python Django?
- python - req.has_data() 在 python 3.7 中不起作用
- sonarqube - 为什么我会收到 Sonarqube 'License Corrupted' 错误?
- c++ - 递归函数c ++上的分段错误
- java - 为什么 Java 12 会尝试将 switch 的结果转换为数字?
- php - 使用异常断点时如何在 PhpStorm 堆栈中黑箱化库
- nginx - 如何使用 Chef 为 nginx 创建 .htpasswd 文件
- html - 用加载动画填充字体真棒图标
- python - 当python中的输入为yes时,我想再次从头开始循环这个程序