使用PySide6+QtAsyncio+Bleak实现BLE连接时遇QtTask未实现错误
解决PySide6+QtAsyncio+Bleak连接时的"QtTask.cancelling is not implemented"错误
错误原因
- 混用标准
asyncio.ensure_future和QtAsyncio的自定义Task实现,两者任务取消逻辑不兼容 - 在
async with BleakClient上下文内手动调用await client.connect()属于冗余操作,会导致任务状态异常
修复方案及代码修改
1. 修正按钮点击的协程调度方式
改用QtAsyncio提供的create_task管理异步任务,替代asyncio.ensure_future:
class MainWindow(QMainWindow): def __init__(self): super().__init__() # 初始化连接按钮 self.connect_button = QPushButton("Connect") # 绑定槽函数,替换原lambda表达式 self.connect_button.clicked.connect(self.on_connect_clicked) def on_connect_clicked(self): # 使用QtAsyncio创建异步任务 QtAsyncio.create_task(self.connect_BLE()) async def connect_BLE(self): print("Connecting") # async with BleakClient会自动处理连接/断开,无需手动调用connect() async with bleak.BleakClient(address_or_ble_device="0C:DC:7E:CB:16:BE") as client: if client.is_connected: print("已成功连接设备") # 这里可添加BLE操作,比如读取特征、订阅通知等 # 示例:await client.read_gatt_char("你的特征UUID") else: print("连接失败") print("连接已关闭")
2. 主函数保持不变
确保导入QtAsyncio并启动事件循环:
import sys from PySide6.QtWidgets import QApplication, QMainWindow, QPushButton import bleak from qtasyncio import QtAsyncio if __name__ == "__main__": app = QApplication(sys.argv) main_window = MainWindow() main_window.show() QtAsyncio.run()
关键说明
- QtAsyncio的事件循环使用自定义
QtTask实现,必须用QtAsyncio.create_task创建异步任务,避免和标准asyncio的Task机制冲突 BleakClient的async with上下文管理器会自动执行连接、断开操作,手动调用connect()会触发重复连接逻辑,引发任务状态异常
内容的提问来源于stack exchange,提问作者Eduardo Carrasco
相关产品推荐
相关产品推荐

