首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用PyQt5.Qt蓝牙扫描蓝牙设备

用PyQt5.Qt蓝牙扫描蓝牙设备
EN

Stack Overflow用户
提问于 2019-01-14 06:00:59
回答 1查看 2.6K关注 0票数 1

我试图使用PyQt5 (5.11.3)来使用QtBluetooth API来扫描蓝牙设备。

设备发现API被列出为我的平台(macOS 10.14.2)所支持的,并且我已经能够做其他与蓝牙相关的事情,例如获取主机控制器的地址和连接设备的列表地址。

下面是设置回调的尝试( Qt术语中的插槽?)每当检测到新设备时,就会发生错误,或扫描完成。此外,计时器会打印出扫描当前是否处于活动状态,以及到目前为止发现的任何设备的列表。

虽然我的错误回调从不触发,而且定时器总是打印出扫描是活动的,而且我的系统日志显示蓝牙控制器处于扫描模式,但我没有看到任何设备。我知道我至少应该看几个。

代码语言:javascript
复制
#!/usr/bin/env python
import signal
import sys

from PyQt5 import QtBluetooth as QtBt
from PyQt5 import QtCore


class Application(QtCore.QCoreApplication):
  def __init__(self, *args, **kwargs):
    super().__init__(*args, **kwargs)
    self.scan_for_devices()
    self.exec()

  def display_status(self):
    print(self.agent.isActive(), self.agent.discoveredDevices())

  def foo(self, *args, **kwargs):
    print('foo', args, kwargs)

  def scan_for_devices(self):
    self.agent = QtBt.QBluetoothDeviceDiscoveryAgent(self)
    self.agent.deviceDiscovered.connect(self.foo)
    self.agent.finished.connect(self.foo)
    self.agent.error.connect(self.foo)
    self.agent.setLowEnergyDiscoveryTimeout(1000)

    timer = QtCore.QTimer(self.agent)
    timer.start(500)
    timer.timeout.connect(self.display_status)

    self.agent.start()


if __name__ == '__main__':
  import sys
  app = Application(sys.argv)

不过,C++示例确实适用于我的系统:http://doc.qt.io/qt-5/qtbluetooth-btscanner-example.html

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-01-15 04:03:00

原来这是一个已知的,但(表面上?)关于macOS的Qt的无文档问题。背景是QTBUG-46625。通常,QtCoreApplication on macOS使用Qt自己的事件循环。但是,macOS上的蓝牙框架需要CoreFoundation事件循环,在创建QtCoreApplication实例之前可以像这样激活该循环:

代码语言:javascript
复制
if sys.platform == 'darwin':
    os.environ['QT_EVENT_DISPATCHER_CORE_FOUNDATION'] = '1'

或者,您可以代之以子类QtWidget.QApplication

不幸的是,这会导致Python进程出现一个停靠图标。我还没想出藏起来的办法。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54176410

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档