PyQt5 连接到 Websocket - 等待来自服务器的信号

Posted

技术标签:

【中文标题】PyQt5 连接到 Websocket - 等待来自服务器的信号【英文标题】:PyQt5 connect to Websocket - wait for signal from server 【发布时间】:2018-02-09 15:45:32 【问题描述】:

我正在尝试连接到通过 apiport 提供 REST Api 的扫描仪。在我这样做之前,我必须使用 PyQt5 连接到扫描仪并签署一个挑战。我有一个 C++ 代码作为示例,但我找不到相应的 PyQt 类/方法。

基本上我正在寻找一种方法来从 C++ 中替换这些行:

QWebSocket socket;
QString address = "127.0.0.1";
QString port = "1234";
connect(&socket,&QWebSocket::textMessageReceived,this,&Client::onTextMessageReceived);
socket.open(QUrl(QString("ws://%1:%2").arg(address).arg(port)));

我的问题是这一行:

connect(&socket,&QWebSocket::textMessageReceived,this,&Client::onTextMessageReceived);

有人可以帮我解决这个问题吗? 到目前为止,我所拥有的是:(但它会引发错误: TypeError: native Qt signal is not callable)

class Client(QtCore.QObject):
    def __init__(self, parent):
        super().__init__(parent)

        self.client =  QtWebSockets.QWebSocket("",QtWebSockets.QWebSocketProtocol.Version13,None)
        #self.client.error.connect(self.error)
        print("Trigger")
        trigger = self.client.textMessageReceived()


        #self.client.open(QUrl("ws://"+UDP_IP+":"+str(notificationsport)))

    def ontextmsgreceived():
        print("Text MSG received")

    def close(self):
        self.client.close()




global client
app = QApplication(sys.argv)
client = Client(app)
app.exec_()

非常感谢您的帮助!

【问题讨论】:

【参考方案1】:

在 PyQt 中,连接语法如下:

C++:

connect(sender, &Class_sender::some_signal, receiver, &Class_receiver::some_slot);

蟒蛇:

sender.some_signal.connect(receiver.some_slot)

所以在你的情况下:

self.client.textMessageReceived.connect(self.ontextmsgreceived)

另一个问题是你的槽是类的方法所以第一个参数必须是self,另外textMessageReceived信号发送一个文本作为参数,所以槽必须有相同的参数:

def ontextmsgreceived(self, message):
    print("Text MSG received", message)

【讨论】:

非常感谢!效果很好! @benschbob91 如果我的回答对您有帮助,请不要忘记将其标记为正确,如果您不知道该怎么做,请查看tour

以上是关于PyQt5 连接到 Websocket - 等待来自服务器的信号的主要内容,如果未能解决你的问题,请参考以下文章

JS Websocket 卡在连接到 TCPListener 的状态 - VB.net

在将用户连接到服务器之前,如何等待 Socket.IO 建立套接字连接?

连接到websocket,headers必须同时是字符串和字典?

无法连接到 symfony 中的 websocket 服务器

PyQt5 无法连接到显示器

PyQt5:如何一次连接到两个 D-Bus 服务?