You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用PySide6+QtAsyncio+Bleak实现BLE连接时遇QtTask未实现错误

解决PySide6+QtAsyncio+Bleak连接时的"QtTask.cancelling is not implemented"错误

错误原因

  1. 混用标准asyncio.ensure_future和QtAsyncio的自定义Task实现,两者任务取消逻辑不兼容
  2. 在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.25 23:42:24