Qt Bluetooth - no devices discovered.
-
@jenya7 https://doc.qt.io/qt-5/qbluetoothdevicediscoveryagent.html#finished - does not look like private to me.
Please post whole error message and code.@jsulm said in Qt Bluetooth - no devices discovered.:
@jenya7 https://doc.qt.io/qt-5/qbluetoothdevicediscoveryagent.html#finished - does not look like private to me.
Please post whole error message and code.QBluetoothDeviceDiscoveryAgent - it is global.
but in the class
private: QBluetoothDeviceDiscoveryAgent *discoveryAgent;and in constructor
connect(discoveryAgent, &QBluetoothDeviceDiscoveryAgent::finished, this, &Device::deviceScanFinished);Actually it's a pointer ( *discoveryAgent). How do I pass my object (QBluetoothDeviceDiscoveryAgent ) to the class?
-
@jsulm said in Qt Bluetooth - no devices discovered.:
@jenya7 https://doc.qt.io/qt-5/qbluetoothdevicediscoveryagent.html#finished - does not look like private to me.
Please post whole error message and code.QBluetoothDeviceDiscoveryAgent - it is global.
but in the class
private: QBluetoothDeviceDiscoveryAgent *discoveryAgent;and in constructor
connect(discoveryAgent, &QBluetoothDeviceDiscoveryAgent::finished, this, &Device::deviceScanFinished);Actually it's a pointer ( *discoveryAgent). How do I pass my object (QBluetoothDeviceDiscoveryAgent ) to the class?
@jenya7 said in Qt Bluetooth - no devices discovered.:
Actually it's a pointer ( *discoveryAgent). How do I pass my object (QBluetoothDeviceDiscoveryAgent ) to the class?
You don't.
What I suggested is:- Add a signal to Device class
- Connect discoveryAgent, &QBluetoothDeviceDiscoveryAgent::finished to this new signal
- Other classes can now connect to this new signal
No need to pass anything to anybody...
-
@jenya7 said in Qt Bluetooth - no devices discovered.:
Actually it's a pointer ( *discoveryAgent). How do I pass my object (QBluetoothDeviceDiscoveryAgent ) to the class?
You don't.
What I suggested is:- Add a signal to Device class
- Connect discoveryAgent, &QBluetoothDeviceDiscoveryAgent::finished to this new signal
- Other classes can now connect to this new signal
No need to pass anything to anybody...
@jsulm said in Qt Bluetooth - no devices discovered.:
@jenya7 said in Qt Bluetooth - no devices discovered.:
Actually it's a pointer ( *discoveryAgent). How do I pass my object (QBluetoothDeviceDiscoveryAgent ) to the class?
You don't.
What I suggested is:- Add a signal to Device class
- Connect discoveryAgent, &QBluetoothDeviceDiscoveryAgent::finished to this new signal
- Other classes can now connect to this new signal
No need to pass anything to anybody...
OK.
Device::Device() { //! [les-devicediscovery-1] discoveryAgent = new QBluetoothDeviceDiscoveryAgent(); discoveryAgent->setLowEnergyDiscoveryTimeout(5000); connect(discoveryAgent, &QBluetoothDeviceDiscoveryAgent::deviceDiscovered, this, &Device::addDevice); connect(discoveryAgent, QOverload<QBluetoothDeviceDiscoveryAgent::Error>::of(&QBluetoothDeviceDiscoveryAgent::error), this, &Device::deviceScanError); connect(discoveryAgent, &QBluetoothDeviceDiscoveryAgent::finished, this, &Device::deviceScanFinished); //! [les-devicediscovery-1] setUpdate("Search"); } a private finished connected to a private deviceScanFinished. What's the point in it? -
@jsulm said in Qt Bluetooth - no devices discovered.:
@jenya7 said in Qt Bluetooth - no devices discovered.:
Actually it's a pointer ( *discoveryAgent). How do I pass my object (QBluetoothDeviceDiscoveryAgent ) to the class?
You don't.
What I suggested is:- Add a signal to Device class
- Connect discoveryAgent, &QBluetoothDeviceDiscoveryAgent::finished to this new signal
- Other classes can now connect to this new signal
No need to pass anything to anybody...
OK.
Device::Device() { //! [les-devicediscovery-1] discoveryAgent = new QBluetoothDeviceDiscoveryAgent(); discoveryAgent->setLowEnergyDiscoveryTimeout(5000); connect(discoveryAgent, &QBluetoothDeviceDiscoveryAgent::deviceDiscovered, this, &Device::addDevice); connect(discoveryAgent, QOverload<QBluetoothDeviceDiscoveryAgent::Error>::of(&QBluetoothDeviceDiscoveryAgent::error), this, &Device::deviceScanError); connect(discoveryAgent, &QBluetoothDeviceDiscoveryAgent::finished, this, &Device::deviceScanFinished); //! [les-devicediscovery-1] setUpdate("Search"); } a private finished connected to a private deviceScanFinished. What's the point in it?This post is deleted! -
@jsulm said in Qt Bluetooth - no devices discovered.:
@jenya7 said in Qt Bluetooth - no devices discovered.:
Actually it's a pointer ( *discoveryAgent). How do I pass my object (QBluetoothDeviceDiscoveryAgent ) to the class?
You don't.
What I suggested is:- Add a signal to Device class
- Connect discoveryAgent, &QBluetoothDeviceDiscoveryAgent::finished to this new signal
- Other classes can now connect to this new signal
No need to pass anything to anybody...
OK.
Device::Device() { //! [les-devicediscovery-1] discoveryAgent = new QBluetoothDeviceDiscoveryAgent(); discoveryAgent->setLowEnergyDiscoveryTimeout(5000); connect(discoveryAgent, &QBluetoothDeviceDiscoveryAgent::deviceDiscovered, this, &Device::addDevice); connect(discoveryAgent, QOverload<QBluetoothDeviceDiscoveryAgent::Error>::of(&QBluetoothDeviceDiscoveryAgent::error), this, &Device::deviceScanError); connect(discoveryAgent, &QBluetoothDeviceDiscoveryAgent::finished, this, &Device::deviceScanFinished); //! [les-devicediscovery-1] setUpdate("Search"); } a private finished connected to a private deviceScanFinished. What's the point in it?@jenya7 Did you actually read what I wrote?!
For the third time: you add a new SIGNAL to Device class...connect(discoveryAgent, &QBluetoothDeviceDiscoveryAgent::finished, this, &Device::scanFinished); // scanFinished is the new signal -
@jsulm said in Qt Bluetooth - no devices discovered.:
@jenya7 And why is deviceScanFinished private?
It is actually apparent that it should be public...it's an official example in the examples folder (C:\Qt\Examples\Qt-5.12.0\bluetooth\lowenergyscanner).
I wouldn't dare to change it, only if you say so. -
@jsulm said in Qt Bluetooth - no devices discovered.:
@jenya7 And why is deviceScanFinished private?
It is actually apparent that it should be public...it's an official example in the examples folder (C:\Qt\Examples\Qt-5.12.0\bluetooth\lowenergyscanner).
I wouldn't dare to change it, only if you say so. -
@jsulm
What if I do deviceScanFinished public?OK. I see what's going on. Just a strong encapsulation.
The signal already set
connect(discoveryAgent, &QBluetoothDeviceDiscoveryAgent::finished, this, &Device::deviceScanFinished);and it sets m_deviceScanState
void Device::deviceScanFinished() { emit devicesUpdated(); m_deviceScanState = false; emit stateChanged(); if (devices.isEmpty()) setUpdate("No Low Energy devices found..."); else setUpdate("Done! Scan Again!"); }so my
while (bt_device.state()) ;actually tests the memeber
bool Device::state() { return m_deviceScanState; }so deviceScanFinished never occurs.
-
@jsulm
What if I do deviceScanFinished public?OK. I see what's going on. Just a strong encapsulation.
The signal already set
connect(discoveryAgent, &QBluetoothDeviceDiscoveryAgent::finished, this, &Device::deviceScanFinished);and it sets m_deviceScanState
void Device::deviceScanFinished() { emit devicesUpdated(); m_deviceScanState = false; emit stateChanged(); if (devices.isEmpty()) setUpdate("No Low Energy devices found..."); else setUpdate("Done! Scan Again!"); }so my
while (bt_device.state()) ;actually tests the memeber
bool Device::state() { return m_deviceScanState; }so deviceScanFinished never occurs.
@jenya7 said in Qt Bluetooth - no devices discovered.:
What if I do deviceScanFinished public?
To achieve what exactly? deviceScanFinished is a slot not signal in Device - how will making it public help other classes?
"The signal already set" - the signal from private member is "set", this does not help other classes as you already discovered.
Why don't you try my approach? Signals/slots are one of the most important features in Qt and it is really not much work:
class Device... { signals: void scanFinished(); } // In Device constructor: connect(discoveryAgent, &QBluetoothDeviceDiscoveryAgent::finished, this, &Device::deviceScanFinished); connect(discoveryAgent, &QBluetoothDeviceDiscoveryAgent::finished, this, &Device::scanFinished); // Now in some other class you simply do: connect(&bt_device, &Device::scanFinished, this, &SomeOtherClass::someSlot);Isn't this easy and clear? And you do not expose any private members from Device to outer world (which would be bad design).
-
@jenya7 said in Qt Bluetooth - no devices discovered.:
What if I do deviceScanFinished public?
To achieve what exactly? deviceScanFinished is a slot not signal in Device - how will making it public help other classes?
"The signal already set" - the signal from private member is "set", this does not help other classes as you already discovered.
Why don't you try my approach? Signals/slots are one of the most important features in Qt and it is really not much work:
class Device... { signals: void scanFinished(); } // In Device constructor: connect(discoveryAgent, &QBluetoothDeviceDiscoveryAgent::finished, this, &Device::deviceScanFinished); connect(discoveryAgent, &QBluetoothDeviceDiscoveryAgent::finished, this, &Device::scanFinished); // Now in some other class you simply do: connect(&bt_device, &Device::scanFinished, this, &SomeOtherClass::someSlot);Isn't this easy and clear? And you do not expose any private members from Device to outer world (which would be bad design).
@jsulm
It seems OK. But here in the constructorBT_DEVICE::BT_DEVICE(QObject *parent) : QObject(parent) { connect(&bt_device, &Device::scanFinished, this, &BT_DEVICE::ScanFinished); }I get - "undefined reference to `vtable for BT_DEVICE' ". And I don't have any virtual function.
-
@jsulm
It seems OK. But here in the constructorBT_DEVICE::BT_DEVICE(QObject *parent) : QObject(parent) { connect(&bt_device, &Device::scanFinished, this, &BT_DEVICE::ScanFinished); }I get - "undefined reference to `vtable for BT_DEVICE' ". And I don't have any virtual function.
@jenya7 Please read https://doc.qt.io/qt-5/signalsandslots.html
If you want to have signals and/or slots in a class you have to derive this class from QObject and add Q_OBJECT macro right at the beginning of your class.#include <QObject> class BT_DEVICE : public QObject { Q_OBJECT signals: void scanFinished(); ...Do a complete rebuild of your project after these changes.
-
@jenya7 Please read https://doc.qt.io/qt-5/signalsandslots.html
If you want to have signals and/or slots in a class you have to derive this class from QObject and add Q_OBJECT macro right at the beginning of your class.#include <QObject> class BT_DEVICE : public QObject { Q_OBJECT signals: void scanFinished(); ...Do a complete rebuild of your project after these changes.
@jsulm
this is h fileclass BT_DEVICE : public QObject { Q_OBJECT public: BT_DEVICE(QObject *parent = nullptr); void BLE_Scan(); signals: void ScanFinished(); };and cpp file
BT_DEVICE::BT_DEVICE(QObject *parent) : QObject(parent) { connect(&bt_device, &Device::scanFinished, this, &BT_DEVICE::ScanFinished); } void BT_DEVICE::BLE_Scan() { scanning = 1; bt_device.startDeviceDiscovery(); while (scanning) ; QVariant devices = bt_device.getDevices(); } void BT_DEVICE::ScanFinished() { scanning = 0; } -
@jsulm
this is h fileclass BT_DEVICE : public QObject { Q_OBJECT public: BT_DEVICE(QObject *parent = nullptr); void BLE_Scan(); signals: void ScanFinished(); };and cpp file
BT_DEVICE::BT_DEVICE(QObject *parent) : QObject(parent) { connect(&bt_device, &Device::scanFinished, this, &BT_DEVICE::ScanFinished); } void BT_DEVICE::BLE_Scan() { scanning = 1; bt_device.startDeviceDiscovery(); while (scanning) ; QVariant devices = bt_device.getDevices(); } void BT_DEVICE::ScanFinished() { scanning = 0; }@jenya7 said in Qt Bluetooth - no devices discovered.:
while (scanning) ;
Not related to your current problem: this is a no go in an event driven application! You are blocking the event loop! This means that no signals will be handled. Redesign this part of your app.
Back to your current problem: I did a mistake above. BT_DEVICE::ScanFinished should be a slot of course.
-
@jenya7 said in Qt Bluetooth - no devices discovered.:
while (scanning) ;
Not related to your current problem: this is a no go in an event driven application! You are blocking the event loop! This means that no signals will be handled. Redesign this part of your app.
Back to your current problem: I did a mistake above. BT_DEVICE::ScanFinished should be a slot of course.
@jsulm
yes. it was stupid of me to block. for now
hclass BT_DEVICE : public QObject { Q_OBJECT public: BT_DEVICE(QObject *parent = nullptr); void BLE_Scan(); public slots: void ScanFinished(); };cpp
BT_DEVICE::BT_DEVICE(QObject *parent) : QObject(parent) { //for debug //connect(&bt_device, &Device::scanFinished, this, &BT_DEVICE::ScanFinished); } void BT_DEVICE::BLE_Scan() { scanning = 1; bt_device.startDeviceDiscovery(); } void BT_DEVICE::ScanFinished() { QVariant devices = bt_device.getDevices(); }Is it OK?
-
@jsulm
yes. it was stupid of me to block. for now
hclass BT_DEVICE : public QObject { Q_OBJECT public: BT_DEVICE(QObject *parent = nullptr); void BLE_Scan(); public slots: void ScanFinished(); };cpp
BT_DEVICE::BT_DEVICE(QObject *parent) : QObject(parent) { //for debug //connect(&bt_device, &Device::scanFinished, this, &BT_DEVICE::ScanFinished); } void BT_DEVICE::BLE_Scan() { scanning = 1; bt_device.startDeviceDiscovery(); } void BT_DEVICE::ScanFinished() { QVariant devices = bt_device.getDevices(); }Is it OK?
@jenya7 said in Qt Bluetooth - no devices discovered.:
Is it OK?
Why did you comment out the connect?
-
@jenya7 said in Qt Bluetooth - no devices discovered.:
Is it OK?
Why did you comment out the connect?
@jsulm said in Qt Bluetooth - no devices discovered.:
@jenya7 said in Qt Bluetooth - no devices discovered.:
Is it OK?
Why did you comment out the connect?
for debug. I still get the error.
On Windows I get a different error - error: multiple definition of `Device::scanFinished()' in moc_device.cpp.
first defined here device.cpp.
I wonder how can it be - moc file is a generated file after build. -
@jsulm said in Qt Bluetooth - no devices discovered.:
@jenya7 said in Qt Bluetooth - no devices discovered.:
Is it OK?
Why did you comment out the connect?
for debug. I still get the error.
On Windows I get a different error - error: multiple definition of `Device::scanFinished()' in moc_device.cpp.
first defined here device.cpp.
I wonder how can it be - moc file is a generated file after build.@jenya7 said in Qt Bluetooth - no devices discovered.:
I wonder how can it be - moc file is a generated file after build
It is probably a remnant from previos version when scanFinished was declared as signal.
Do a complete rebuild: delete build folder, run qmake and build. -
@jenya7 said in Qt Bluetooth - no devices discovered.:
I wonder how can it be - moc file is a generated file after build
It is probably a remnant from previos version when scanFinished was declared as signal.
Do a complete rebuild: delete build folder, run qmake and build.@jsulm said in Qt Bluetooth - no devices discovered.:
@jenya7 said in Qt Bluetooth - no devices discovered.:
I wonder how can it be - moc file is a generated file after build
It is probably a remnant from previos version when scanFinished was declared as signal.
Do a complete rebuild: delete build folder, run qmake and build.Deleted all from the build folder. Clean. Rebuild. I see new files created. The same problem.
Renamed scanFinished for scanCompleted. Still the same problem. -
@jsulm said in Qt Bluetooth - no devices discovered.:
@jenya7 said in Qt Bluetooth - no devices discovered.:
I wonder how can it be - moc file is a generated file after build
It is probably a remnant from previos version when scanFinished was declared as signal.
Do a complete rebuild: delete build folder, run qmake and build.Deleted all from the build folder. Clean. Rebuild. I see new files created. The same problem.
Renamed scanFinished for scanCompleted. Still the same problem.This post is deleted! -
@jsulm said in Qt Bluetooth - no devices discovered.:
@jenya7 said in Qt Bluetooth - no devices discovered.:
Is it OK?
Why did you comment out the connect?
for debug. I still get the error.
On Windows I get a different error - error: multiple definition of `Device::scanFinished()' in moc_device.cpp.
first defined here device.cpp.
I wonder how can it be - moc file is a generated file after build.@jenya7 said in Qt Bluetooth - no devices discovered.:
On Windows I get a different error - error: multiple definition of `Device::scanFinished()' in moc_device.cpp.
Just realised: this is in Device class.
Please show Device code (header and cpp).
You probably defined scanFinished() in cpp file, you should not do that for signals!