目录
一、常见错误
错误一、使用协程函数作为槽函数。
错误二、在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, asyncSlot
class 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()