目录
一、常见错误
错误一、使用协程函数作为槽函数。
错误二、在Qt循环中创建新的loop
二、解决方法:
①安装库qasync
②修改Qt入口
③异步槽函数
④异步函数
⑤整体示例
一、常见错误
错误一、使用协程函数作为槽函数。
这样是肯定是不行,协程函数一定要跑在loop中,这里没有loop直接跑肯定会失败。
错误二、在Qt循环中创建新的loop
主线程通常已经被 Qt 的事件循环占用,因此不应该再创建新的异步事件循环。
二、解决方法:
Qt 和 asyncio 的事件循环可以共存,但需要一些额外的设置。你可以使用 qasync 库来简化这个过程。
①安装库qasync
pip install qasync
②修改Qt入口
③异步槽函数
@asyncSlot()
④异步函数
asyncio.ensure_future()
⑤整体示例
import sys
import asyncio
from PySide6.QtWidgets import QApplication, QWidget, QVBoxLayout, QPushButton
from qasync import QEventLoop, asyncSlotclass MyWindow(QWidget):def __init__(self, parent=None):super(MyWindow, self).__init__(parent)# 设置垂直布局self.setLayout(QVBoxLayout())# 创建组件self.button = QPushButton('点击')# 信号连接槽函数self.button.clicked.connect(self.btn_event)# 加入布局self.layout().addWidget(self.button)# 启动异步初始化任务asyncio.ensure_future(self.init_ui())@asyncSlot()async def btn_event(self):print(123)async def init_ui(self):print(456)if __name__ == '__main__':# 创建主循环app = QApplication(sys.argv)# 创建异步事件循环loop = QEventLoop(app)asyncio.set_event_loop(loop)# 创建窗口myWindow = MyWindow()# 显示窗口myWindow.show()# 运行事件循环loop.run_forever()