Skip to content
  • Categories
  • Recent
  • Tags
  • Popular
  • Users
  • Groups
  • Search
  • Get Qt
  • Unsolved
Collapse
Brand Logo
  1. Home
  2. Qt Development
  3. General and Desktop
  4. Qt Bluetooth - no devices discovered.
Qt 6.12 LTS is out! See what's new in the release blog

Qt Bluetooth - no devices discovered.

Scheduled Pinned Locked Moved Solved General and Desktop
35 Posts 4 Posters 29.7k Views
  • Oldest to Newest
  • Newest to Oldest
  • Most Votes
Reply
  • Reply as topic
Log in to reply
This topic has been deleted. Only users with topic management privileges can see it.
  • J jenya7

    @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?

    jsulmJ Offline
    jsulmJ Offline
    jsulm
    Lifetime Qt Champion
    wrote on last edited by
    #10

    @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...

    J 1 Reply Last reply
    0
    • jsulmJ jsulm

      @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...

      J Offline
      J Offline
      jenya7
      wrote on last edited by jenya7
      #11

      @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?
      
      jsulmJ 2 Replies Last reply
      0
      • J jenya7

        @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?
        
        jsulmJ Offline
        jsulmJ Offline
        jsulm
        Lifetime Qt Champion
        wrote on last edited by
        #12
        This post is deleted!
        J 1 Reply Last reply
        0
        • J jenya7

          @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?
          
          jsulmJ Offline
          jsulmJ Offline
          jsulm
          Lifetime Qt Champion
          wrote on last edited by jsulm
          #13

          @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
          
          1 Reply Last reply
          0
          • jsulmJ jsulm

            This post is deleted!

            J Offline
            J Offline
            jenya7
            wrote on last edited by jenya7
            #14

            @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.

            jsulmJ 1 Reply Last reply
            0
            • J jenya7

              @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.

              jsulmJ Offline
              jsulmJ Offline
              jsulm
              Lifetime Qt Champion
              wrote on last edited by
              #15

              @jenya7 Please read my post above your last post...

              J 1 Reply Last reply
              0
              • jsulmJ jsulm

                @jenya7 Please read my post above your last post...

                J Offline
                J Offline
                jenya7
                wrote on last edited by jenya7
                #16

                @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.

                jsulmJ 1 Reply Last reply
                0
                • J jenya7

                  @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.

                  jsulmJ Offline
                  jsulmJ Offline
                  jsulm
                  Lifetime Qt Champion
                  wrote on last edited by jsulm
                  #17

                  @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).

                  J 1 Reply Last reply
                  1
                  • jsulmJ jsulm

                    @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).

                    J Offline
                    J Offline
                    jenya7
                    wrote on last edited by jenya7
                    #18

                    @jsulm
                    It seems OK. But here in the constructor

                    BT_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.

                    jsulmJ 1 Reply Last reply
                    0
                    • J jenya7

                      @jsulm
                      It seems OK. But here in the constructor

                      BT_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.

                      jsulmJ Offline
                      jsulmJ Offline
                      jsulm
                      Lifetime Qt Champion
                      wrote on last edited by
                      #19

                      @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.

                      J 1 Reply Last reply
                      0
                      • jsulmJ jsulm

                        @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.

                        J Offline
                        J Offline
                        jenya7
                        wrote on last edited by
                        #20

                        @jsulm
                        this is h file

                        class 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;
                        }
                        
                        jsulmJ 1 Reply Last reply
                        0
                        • J jenya7

                          @jsulm
                          this is h file

                          class 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;
                          }
                          
                          jsulmJ Offline
                          jsulmJ Offline
                          jsulm
                          Lifetime Qt Champion
                          wrote on last edited by
                          #21

                          @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.

                          J 1 Reply Last reply
                          0
                          • jsulmJ jsulm

                            @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.

                            J Offline
                            J Offline
                            jenya7
                            wrote on last edited by
                            #22

                            @jsulm
                            yes. it was stupid of me to block. for now
                            h

                            class 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?

                            jsulmJ 1 Reply Last reply
                            0
                            • J jenya7

                              @jsulm
                              yes. it was stupid of me to block. for now
                              h

                              class 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?

                              jsulmJ Offline
                              jsulmJ Offline
                              jsulm
                              Lifetime Qt Champion
                              wrote on last edited by
                              #23

                              @jenya7 said in Qt Bluetooth - no devices discovered.:

                              Is it OK?

                              Why did you comment out the connect?

                              J 1 Reply Last reply
                              0
                              • jsulmJ jsulm

                                @jenya7 said in Qt Bluetooth - no devices discovered.:

                                Is it OK?

                                Why did you comment out the connect?

                                J Offline
                                J Offline
                                jenya7
                                wrote on last edited by jenya7
                                #24

                                @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.

                                jsulmJ 2 Replies Last reply
                                0
                                • J jenya7

                                  @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.

                                  jsulmJ Offline
                                  jsulmJ Offline
                                  jsulm
                                  Lifetime Qt Champion
                                  wrote on last edited by
                                  #25

                                  @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.

                                  J 1 Reply Last reply
                                  0
                                  • jsulmJ jsulm

                                    @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.

                                    J Offline
                                    J Offline
                                    jenya7
                                    wrote on last edited by
                                    #26

                                    @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.

                                    jsulmJ 1 Reply Last reply
                                    0
                                    • J jenya7

                                      @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.

                                      jsulmJ Offline
                                      jsulmJ Offline
                                      jsulm
                                      Lifetime Qt Champion
                                      wrote on last edited by
                                      #27
                                      This post is deleted!
                                      1 Reply Last reply
                                      0
                                      • J jenya7

                                        @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.

                                        jsulmJ Offline
                                        jsulmJ Offline
                                        jsulm
                                        Lifetime Qt Champion
                                        wrote on last edited by
                                        #28

                                        @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!

                                        J 1 Reply Last reply
                                        0
                                        • jsulmJ jsulm

                                          @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!

                                          J Offline
                                          J Offline
                                          jenya7
                                          wrote on last edited by
                                          #29

                                          @jsulm
                                          I see. Now on Windows it compiles OK. On Linux the same 'vtable' problem.

                                          jsulmJ 1 Reply Last reply
                                          0

                                          • Login

                                          • Login or register to search.
                                          • First post
                                            Last post
                                          0
                                          • Categories
                                          • Recent
                                          • Tags
                                          • Popular
                                          • Users
                                          • Groups
                                          • Search
                                          • Get Qt
                                          • Unsolved