繁体   English   中英

如何在不同类中的 Main Widget 和 QObject 之间传递数据

[英]How to pass data between Main Widget and QObject that are in different classes

我的问题是,如何在服务器和正在运行的 QWidget 应用程序之间传递数据? 例如,当在 MyServer 中调用 onNewConnection(self) 函数时,我想在 UI 中显示一个新标签,上面写着“客户端已连接”。

任何帮助将不胜感激!

对于使用 Qt Websocket 服务器的 PyQt5 应用程序,我有以下程序结构:

from PyQt5.QtWidgets import QApplication, QWidget, QLabel, QComboBox, QMainWindow, QPushButton, QVBoxLayout, QSystemTrayIcon, QStyle, QMenu, qApp, QAction
from PyQt5.QtGui import QIcon, QPixmap, QIcon, QFont
from PyQt5.QtCore import pyqtSlot, Qt, QObject, pyqtSignal
from PyQt5 import QtWebSockets, QtNetwork

import sys




class App(QWidget):
    def __init__(self, *args, **kwargs):
        super().__init__()

        self.title = "Title window"
        self.left = 0
        self.top = 35
        self.width = 550
        self.height = 250

    def init_ui(self):
        # Initialise UI elements like buttons, labels, ...


class MyServer(QObject):

    def __init__(self, parent):
        super(QObject, self).__init__(parent)
        self.clients = []
        self.server = QtWebSockets.QWebSocketServer(parent.serverName(), parent.secureMode(), parent)
        if self.server.listen(QtNetwork.QHostAddress.LocalHost, 8765):
            print('Connected: '+self.server.serverName()+' : '+self.server.serverAddress().toString()+':'+str(self.server.serverPort()))
        else:
            print('error')
        self.server.newConnection.connect(self.onNewConnection)

        print(self.server.isListening())

    def onNewConnection(self):
        print("Connected")
        #self.mySignal.emit("connected")
        self.clientConnection = self.server.nextPendingConnection()
        self.clientConnection.textMessageReceived.connect(self.processTextMessage)
        self.clientConnection.binaryMessageReceived.connect(self.processBinaryMessage)
        self.clientConnection.disconnected.connect(self.socketDisconnected)

        self.clients.append(self.clientConnection)

    def processTextMessage(self,  message):
        if (self.clientConnection):
            self.clientConnection.sendTextMessage(message)
            print(message)

    def processBinaryMessage(self,  message):
        if (self.clientConnection):
            self.clientConnection.sendBinaryMessage(message)

    def socketDisconnected(self):
        if (self.clientConnection):
            self.clients.remove(self.clientConnection)
            self.clientConnection.deleteLater()

app = QApplication(sys.argv)
ex = App()
serverObject = QtWebSockets.QWebSocketServer('My Socket', QtWebSockets.QWebSocketServer.NonSecureMode)
server = MyServer(serverObject)
serverObject.closed.connect(app.quit)
app.exec_()

Qt 最优雅和推荐的是使用信号和插槽。

此外,您的服务器有一个错误,因为“clientConnection”是指最后一个连接的套接字,因此如果它连接了 n 个“套接字”并且第一个接收到信息,您会将其发送到最后一个似乎不正确的。 最后你创建了 QWebSocketServer ,你只用它来存储名称和没有意义的方式,相反,最好将参数传递给构造函数

import sys

from PyQt5 import QtCore, QtWidgets, QtWebSockets, QtNetwork


class App(QtWidgets.QWidget):
    def __init__(self, parent=None):
        super().__init__(parent)
        self.init_ui()

    def init_ui(self):
        self.status_label = QtWidgets.QLabel(alignment=QtCore.Qt.AlignCenter)

        lay = QtWidgets.QVBoxLayout(self)
        lay.addWidget(self.status_label)

    @QtCore.pyqtSlot(str)
    def on_status_changed(self, status):
        self.status_label.setText(status)


class MyServer(QtCore.QObject):
    statusChanged = QtCore.pyqtSignal(str)

    def __init__(self, name, mode, parent=None):
        super().__init__(parent)
        self.clients = []
        self.server = QtWebSockets.QWebSocketServer(name, mode, parent)
        self.server.closed.connect(QtCore.QCoreApplication.quit)
        if self.server.listen(QtNetwork.QHostAddress.LocalHost, 8765):
            print(
                "Connected: {} : {} : {}".format(
                    self.server.serverName(),
                    self.server.serverAddress().toString(),
                    self.server.serverPort(),
                )
            )
        else:
            print("error: {}".format(self.server.errorString()))
        self.server.newConnection.connect(self.onNewConnection)

        print(self.server.isListening())

    @QtCore.pyqtSlot()
    def onNewConnection(self):
        client = self.server.nextPendingConnection()
        client.identifier = QtCore.QUuid.createUuid().toString(QtCore.QUuid.Id128)
        client.textMessageReceived.connect(self.processTextMessage)
        client.binaryMessageReceived.connect(self.processBinaryMessage)
        client.disconnected.connect(self.socketDisconnected)
        self.clients.append(client)
        self.statusChanged.emit("Connected: client-{}".format(client.identifier))

    @QtCore.pyqtSlot(str)
    def processTextMessage(self, message):
        client = self.sender()
        if isinstance(client, QtWebSockets.QWebSocket):
            client.sendTextMessage(message)
            print("Client-{}: {}".format(client.identifier, message))

    @QtCore.pyqtSlot(QtCore.QByteArray)
    def processBinaryMessage(self, message):
        client = self.sender()
        if isinstance(client, QtWebSockets.QWebSocket):
            client.sendBinaryMessage(message)
            print("Client-{}: {}".format(client.identifier, message))

    @QtCore.pyqtSlot()
    def socketDisconnected(self):
        client = self.sender()
        if isinstance(client, QtWebSockets.QWebSocket):
            self.clients.remove(client)
            self.statusChanged.emit("Disconnected: client-{}".format(client.identifier))
            client.deleteLater()


if __name__ == "__main__":

    app = QtWidgets.QApplication(sys.argv)
    ex = App()
    ex.show()

    server = MyServer("My Socket", QtWebSockets.QWebSocketServer.NonSecureMode)
    server.statusChanged.connect(ex.on_status_changed)

    sys.exit(app.exec_())

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM