pika与Qt的积分

问题描述 投票:0回答:1

[最近,一个用户问如何在Qt中使用pika,但是出乎意料的是,该用户在我要发布答案时删除了,这给了我机会,可以通过自动答案提出这个问题,在这里我将尝试公开各种解决方案:

python pyqt5 amqp pyside2 pika
1个回答
0
投票
使用BlockingConnection,必须在另一个线程中执行start_consuming()方法,此外,必须知道回调是在辅助线程中执行的,因此如果要更新GUI,则必须发出信号]]

import threading from PyQt5 import QtCore, QtWidgets # or # from PySide2 import QtCore, QtWidgets import pika class RabbitMQManager(QtCore.QObject): messageChanged = QtCore.pyqtSignal(str) # or # messageChanged = QtCore.Signal(str) def __init__(self, *, parameters=None, parent=None): super().__init__(parent) self._connection = pika.BlockingConnection(parameters) @property def connection(self): return self._connection def start(self): channel = self.connection.channel() channel.queue_declare(queue="hello") channel.basic_consume( queue="hello", on_message_callback=self._callback, auto_ack=True, ) threading.Thread(target=channel.start_consuming, daemon=True).start() print(" [*] Waiting for messages. To exit press CTRL+C") def _callback(self, ch, method, properties, body): print(" [x] Received %r" % body) self.messageChanged.emit(body.decode()) print(threading.current_thread()) def main(): import signal import sys # https://stackoverflow.com/a/6072360 signal.signal(signal.SIGINT, signal.SIG_DFL) app = QtWidgets.QApplication(sys.argv) credentials = pika.PlainCredentials("user", "user") parameters = pika.ConnectionParameters("127.0.0.1", 5672, "/", credentials) rabbit_manager = RabbitMQManager(parameters=parameters) rabbit_manager.start() w = QtWidgets.QTextEdit() w.resize(640, 480) w.show() rabbit_manager.messageChanged.connect(w.append) print(threading.current_thread()) sys.exit(app.exec_()) if __name__ == "__main__": main()

© www.soinside.com 2019 - 2024. All rights reserved.