Qt文档阅读笔记-Bluetooth Scanner Example

Posted IT1995

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Qt文档阅读笔记-Bluetooth Scanner Example相关的知识,希望对你有一定的参考价值。

这个例子说明了如何找蓝牙设备。

官方给出的文档已经没了,下面我自己补充下。

项目是这样的,主要有2个界面,一个是service,一个是device。刚好对应了2个界面类ServiceDiscoveryDialog和DeviceDiscoveryDialog

首先看下main.cpp

#include "device.h"

#include <QApplication>

int main(int argc, char *argv[])

    QApplication app(argc, argv);

    DeviceDiscoveryDialog d;
    QObject::connect(&d, SIGNAL(accepted()), &app, SLOT(quit()));
    d.show();

    app.exec();

    return 0;

入口函数比较简单,就是展示了DeviceDiscoveryDialog界面。

下面是device.h

#ifndef DEVICE_H
#define DEVICE_H

#include "ui_device.h"

#include <qbluetoothlocaldevice.h>

#include <QDialog>

QT_FORWARD_DECLARE_CLASS(QBluetoothDeviceDiscoveryAgent)
QT_FORWARD_DECLARE_CLASS(QBluetoothDeviceInfo)

QT_USE_NAMESPACE

class DeviceDiscoveryDialog : public QDialog

    Q_OBJECT

public:
    DeviceDiscoveryDialog(QWidget *parent = 0);
    ~DeviceDiscoveryDialog();

public slots:
    void addDevice(const QBluetoothDeviceInfo&);
    void on_power_clicked(bool clicked);
    void on_discoverable_clicked(bool clicked);
    void displayPairingMenu(const QPoint &pos);
    void pairingDone(const QBluetoothAddress&, QBluetoothLocalDevice::Pairing);
private slots:
    void startScan();
    void scanFinished();
    void setGeneralUnlimited(bool unlimited);
    void itemActivated(QListWidgetItem *item);
    void hostModeStateChanged(QBluetoothLocalDevice::HostMode);

private:
    QBluetoothDeviceDiscoveryAgent *discoveryAgent;
    QBluetoothLocalDevice *localDevice;
    Ui_DeviceDiscovery *ui;
;

 这里主要想弄懂的是如何使用Qt的蓝牙类,扫描蓝牙的,所以主要关注点在

看下cpp文件里面怎么用的。

DeviceDiscoveryDialog::DeviceDiscoveryDialog(QWidget *parent)
:   QDialog(parent), localDevice(new QBluetoothLocalDevice),
    ui(new Ui_DeviceDiscovery)

    ui->setupUi(this);

    /*
     * In case of multiple Bluetooth adapters it is possible to set adapter
     * which will be used. Example code:
     *
     * QBluetoothAddress address("XX:XX:XX:XX:XX:XX");
     * discoveryAgent = new QBluetoothDeviceDiscoveryAgent(address);
     *
     **/

    discoveryAgent = new QBluetoothDeviceDiscoveryAgent();
    ......
    connect(discoveryAgent, SIGNAL(deviceDiscovered(QBluetoothDeviceInfo)),
            this, SLOT(addDevice(QBluetoothDeviceInfo)));
    ......

从中可以知道,一般情况下使用,如果你电脑里面有多个蓝牙适配器,可以选择用哪个蓝牙适配器进行扫描,如下:

QBluetoothAddress address("XX:XX:XX:XX:XX:XX");
discoveryAgent = new QBluetoothDeviceDiscoveryAgent(address);

如果电脑上只有1个蓝牙,就不用这么麻烦了。可以直接:

discoveryAgent = new QBluetoothDeviceDiscoveryAgent();

 这里对应了1个关键信号,deviceDiscovered。

[signal] void QBluetoothDeviceDiscoveryAgent::deviceDiscovered(const QBluetoothDeviceInfo &info)

简单描述下就是当发现蓝牙设备后,会触发这个信号,并且将发现的设备以QBluetoothDeviceInfo的形式给到槽参数里面。

这个项目,就将槽参数里面的QBluetoothDeviceInfo进行解析

void DeviceDiscoveryDialog::addDevice(const QBluetoothDeviceInfo &info)

    QString label = QString("%1 %2").arg(info.address().toString()).arg(info.name());
    QList<QListWidgetItem *> items = ui->list->findItems(label, Qt::MatchExactly);
    if (items.empty()) 
        QListWidgetItem *item = new QListWidgetItem(label);
        QBluetoothLocalDevice::Pairing pairingStatus = localDevice->pairingStatus(info.address());
        if (pairingStatus == QBluetoothLocalDevice::Paired || pairingStatus == QBluetoothLocalDevice::AuthorizedPaired )
            item->setTextColor(QColor(Qt::green));
        else
            item->setTextColor(QColor(Qt::black));

        ui->list->addItem(item);
    

还有最后一个更关键的问题怎么触发这个deviceDiscovered,在startScan函数中可以看到。

void DeviceDiscoveryDialog::startScan()

    discoveryAgent->start();
    ui->scan->setEnabled(false);
    ui->inquiryType->setEnabled(false);
void QBluetoothDeviceDiscoveryAgent::start()
Starts Bluetooth device discovery, if it is not already started.
The deviceDiscovered() signal is emitted as each device is discovered. The finished() signal is emitted once device discovery is complete. The discovery utilizes the maximum set of supported discovery methods on the platform.
See also supportedDiscoveryMethods().

当调用QBluetoothDeviceDiscoveryAgent,的start方法后,就会emit2个关键信号,分别是deviceDiscovered()和finished()。

这里跑程序的时候要注意,把电脑的蓝牙打开:

然后就可以Scan了

 

 

以上是关于Qt文档阅读笔记-Bluetooth Scanner Example的主要内容,如果未能解决你的问题,请参考以下文章

Qt文档阅读笔记-Bluetooth Scanner Example

QT开发笔记(USB Bluetooth)

Qt文档阅读笔记-Simple Chat Example解析

Qt文档阅读笔记-Qt5录音功能的实现

Qt文档阅读笔记-Broadcast Sender Example解析

Qt文档阅读笔记-QScopedPointer解析及实例