PyQt5.QtBluetooth

Python und das Qt-Toolkit, erstellen von GUIs mittels des Qt-Designers.
Antworten
Schlaaaange
User
Beiträge: 34
Registriert: Sonntag 5. Januar 2020, 18:05

Hallöchen Python-Scripter,

ich arbeite mich mit Python und dem QT-Framework ein.

Ich würde auch gerne PyQt5.QtBluetooth nutzen.
Dies scheint aber nur unter Linux zu funktionieren.
Unter Windows und Mac funktioniert QTBluetooth nicht.

Auf was greift QT5 dort zu?

Es gibt unter MacOS ja sogar ein eigenes Bluetooth-Framework.
Eigentlich sollte QT dies ja nutzen, oder ?

Hat hier jemand Erfahrung?
Benutzeravatar
sparrow
User
Beiträge: 4193
Registriert: Freitag 17. April 2009, 10:28

Ich habe damit noch nicht gearbeitet aber die Dokumentation sagt anderes.
Schlaaaange
User
Beiträge: 34
Registriert: Sonntag 5. Januar 2020, 18:05

Ja, aber mit PyQt5 scheint es nicht zu funktionieren.
Zumindest funktioniert es bei mir nur unter Linux.
Mit C++ habe ich es noch nicht getestet.
Schlaaaange
User
Beiträge: 34
Registriert: Sonntag 5. Januar 2020, 18:05

Wie bekomme ich beim Device scannen einen Core-EventLoop hin ?
(Für die Delegates)

So:
os.environ['QT_EVENT_DISPATCHER_CORE_FOUNDATION'] = '1'

Unter MacOS tut sich etwas, aber man findet halt sehr wenig Python-Material zu diesem Thema und muss daher stark mit der C++ Doku arbeiten.

Mal sehen ob ich es hinbekomme.
Schlaaaange
User
Beiträge: 34
Registriert: Sonntag 5. Januar 2020, 18:05

Außerdem muss man Einiges in dieser Richtung mit SUDO-Rechten testen.
Benutzeravatar
sparrow
User
Beiträge: 4193
Registriert: Freitag 17. April 2009, 10:28

Man muss bei Qt immer mit der C++ Dokumentation arbeiten. PyQt bzw. Pyside sind ja auch nur Wrapper für die entsprechenden Schnittstellen.
Schlaaaange
User
Beiträge: 34
Registriert: Sonntag 5. Januar 2020, 18:05

Das hier:

Code: Alles auswählen

#!/usr/bin/env python
import signal
import sys
import os

from PyQt5.QtCore import QCoreApplication, QTimer
from PyQt5.QtBluetooth import QBluetoothLocalDevice, QBluetoothDeviceDiscoveryAgent, QBluetoothDeviceInfo


class Application(QCoreApplication):
  def __init__(self, *args, **kwargs):
    super().__init__(*args, **kwargs)
    
    self.dev = QBluetoothDeviceInfo()
    self.dlist = []
    self.counter = 0
    
    self.localDevice = QBluetoothLocalDevice()
    print(self.localDevice.name())
    
    self.scan_for_devices()
    self.exec()

  def display_status(self):
    d = 0
    #print(self.agent.isActive(), self.agent.discoveredDevices())

  def fin(self, *args, **kwargs):
    self.agent.stop()
    self.dlist = self.agent.discoveredDevices()
    while self.counter < len(self.dlist):
        print(self.dlist[self.counter].name())
        self.counter += 1
    os.environ['QT_EVENT_DISPATCHER_CORE_FOUNDATION'] = '0'
    sys.exit(0)
    
  def err(self, *args, **kwargs):
      print("Ein Fehler ist aufgetretten.")

  def scan_for_devices(self):
    self.agent = QBluetoothDeviceDiscoveryAgent(self)
    #self.agent.deviceDiscovered.connect(self.fin)
    self.agent.finished.connect(self.fin)
    self.agent.error.connect(self.err)
    self.agent.setLowEnergyDiscoveryTimeout(1000)
    #self.agent.discoveredDevices()
    
    self.agent.start()
    
    timer = QTimer(self.agent)
    timer.start(500)
    timer.timeout.connect(self.display_status)


if __name__ == '__main__':
  import sys
  
  os.environ['QT_EVENT_DISPATCHER_CORE_FOUNDATION'] = '1'
  
  app = Application(sys.argv)

muss doch auch eleganter gehen.
Antworten