当前位置: 首页 > article >正文

Qt 开发之蓝牙连接

在Qt开发中,你可以通过QBluetoothDeviceDiscoveryAgent来搜索蓝牙设备,并将搜索到的设备显示在一个列表中。每个设备后面可以添加一个“连接”按钮,用户点击按钮后可以连接到对应的蓝牙设备。

以下是一个完整的示例,展示如何实现这一功能:


1. 项目结构

  • 创建一个Qt Widgets应用程序。
  • 使用QListWidgetQTableWidget来显示蓝牙设备列表。
  • 为每个设备添加一个“连接”按钮。

2. 代码实现

2.1 在.pro文件中添加蓝牙模块
QT += bluetooth widgets
2.2 主窗口实现
#include <QWidget>
#include <QVBoxLayout>
#include <QListWidget>
#include <QPushButton>
#include <QBluetoothDeviceDiscoveryAgent>
#include <QBluetoothDeviceInfo>
#include <QBluetoothSocket>
#include <QDebug>

class BluetoothDeviceItem : public QWidget
{
    Q_OBJECT

public:
    BluetoothDeviceItem(const QBluetoothDeviceInfo &deviceInfo, QWidget *parent = nullptr)
        : QWidget(parent), m_deviceInfo(deviceInfo)
    {
        QHBoxLayout *layout = new QHBoxLayout(this);

        // 显示设备名称和地址
        QString deviceText = QString("%1 (%2)").arg(deviceInfo.name()).arg(deviceInfo.address().toString());
        QLabel *label = new QLabel(deviceText, this);
        layout->addWidget(label);

        // 添加连接按钮
        QPushButton *connectButton = new QPushButton("连接", this);
        connect(connectButton, &QPushButton::clicked, this, &BluetoothDeviceItem::onConnectClicked);
        layout->addWidget(connectButton);

        setLayout(layout);
    }

private slots:
    void onConnectClicked()
    {
        qDebug() << "Connecting to:" << m_deviceInfo.name() << m_deviceInfo.address().toString();

        // 创建蓝牙套接字并连接到设备
        QBluetoothSocket *socket = new QBluetoothSocket(QBluetoothServiceInfo::RfcommProtocol, this);
        connect(socket, &QBluetoothSocket::connected, this, [=]() {
            qDebug() << "Connected to device:" << m_deviceInfo.name();
        });
        connect(socket, &QBluetoothSocket::disconnected, this, [=]() {
            qDebug() << "Disconnected from device:" << m_deviceInfo.name();
        });
        connect(socket, QOverload<QBluetoothSocket::SocketError>::of(&QBluetoothSocket::error), this, [=](QBluetoothSocket::SocketError error) {
            qDebug() << "Socket error:" << error;
        });

        // 连接到设备的RFCOMM服务
        socket->connectToService(m_deviceInfo.address(), QBluetoothUuid::SerialPort);
    }

private:
    QBluetoothDeviceInfo m_deviceInfo;
};

class BluetoothDiscoveryWidget : public QWidget
{
    Q_OBJECT

public:
    BluetoothDiscoveryWidget(QWidget *parent = nullptr)
        : QWidget(parent)
    {
        QVBoxLayout *layout = new QVBoxLayout(this);

        // 设备列表
        m_deviceList = new QListWidget(this);
        layout->addWidget(m_deviceList);

        // 开始搜索按钮
        QPushButton *startScanButton = new QPushButton("开始搜索", this);
        connect(startScanButton, &QPushButton::clicked, this, &BluetoothDiscoveryWidget::startDiscovery);
        layout->addWidget(startScanButton);

        setLayout(layout);
    }

private slots:
    void startDiscovery()
    {
        // 清空设备列表
        m_deviceList->clear();

        // 创建设备发现代理
        m_discoveryAgent = new QBluetoothDeviceDiscoveryAgent(this);
        connect(m_discoveryAgent, &QBluetoothDeviceDiscoveryAgent::deviceDiscovered, this, &BluetoothDiscoveryWidget::deviceDiscovered);
        connect(m_discoveryAgent, QOverload<QBluetoothDeviceDiscoveryAgent::Error>::of(&QBluetoothDeviceDiscoveryAgent::error), this, &BluetoothDiscoveryWidget::deviceScanError);
        connect(m_discoveryAgent, &QBluetoothDeviceDiscoveryAgent::finished, this, &BluetoothDiscoveryWidget::deviceScanFinished);

        // 开始搜索
        m_discoveryAgent->start();
    }

    void deviceDiscovered(const QBluetoothDeviceInfo &deviceInfo)
    {
        // 为每个设备创建一个自定义的设备项
        BluetoothDeviceItem *itemWidget = new BluetoothDeviceItem(deviceInfo, this);
        QListWidgetItem *listItem = new QListWidgetItem(m_deviceList);
        m_deviceList->setItemWidget(listItem, itemWidget);
        listItem->setSizeHint(itemWidget->sizeHint());
    }

    void deviceScanError(QBluetoothDeviceDiscoveryAgent::Error error)
    {
        qDebug() << "Scan error:" << error;
    }

    void deviceScanFinished()
    {
        qDebug() << "Scan finished";
    }

private:
    QBluetoothDeviceDiscoveryAgent *m_discoveryAgent = nullptr;
    QListWidget *m_deviceList = nullptr;
};

int main(int argc, char *argv[])
{
    QApplication app(argc, argv);

    BluetoothDiscoveryWidget widget;
    widget.show();

    return app.exec();
}

#include "main.moc"

3. 代码说明

3.1 BluetoothDeviceItem
  • 这是一个自定义的QWidget,用于显示每个蓝牙设备的名称和地址。
  • 每个设备后面都有一个“连接”按钮,点击按钮后会尝试连接到该设备。
3.2 BluetoothDiscoveryWidget
  • 这是主窗口,包含一个设备列表和一个“开始搜索”按钮。
  • 点击“开始搜索”按钮后,会调用QBluetoothDeviceDiscoveryAgent来搜索附近的蓝牙设备。
  • 搜索到的设备会显示在列表中,每个设备后面都有一个“连接”按钮。
3.3 连接逻辑
  • 当用户点击“连接”按钮时,会创建一个QBluetoothSocket,并尝试连接到设备的RFCOMM服务。
  • 连接成功或失败时会输出相应的日志。

4. 运行效果

  1. 运行程序后,点击“开始搜索”按钮,程序会搜索附近的蓝牙设备。
  2. 搜索完成后,设备列表中会显示设备的名称和地址,每个设备后面都有一个“连接”按钮。
  3. 点击“连接”按钮,程序会尝试连接到对应的蓝牙设备。

5. 注意事项

  • 权限:在Android或iOS上运行时,确保应用程序具有蓝牙权限。
  • 平台差异:在某些平台上(如Linux),可能需要额外的配置才能使用蓝牙功能。
  • RFCOMM服务:连接时使用的是QBluetoothUuid::SerialPort,这是标准的RFCOMM服务UUID。如果设备使用其他服务,需要根据实际情况修改UUID。

通过以上代码,你可以轻松实现一个蓝牙设备搜索和连接的界面。


http://www.kler.cn/a/445945.html

相关文章:

  • 在Java虚拟机(JVM)中,方法可以分为虚方法和非虚方法。
  • Hutool工具包的常用工具类的使用介绍
  • 详解 Qt WebEngine 模块
  • 操作系统文件管理
  • RestTemplate实时接收Chunked编码传输的HTTP Response
  • Flask内存马学习
  • hackme靶机保姆及攻略
  • elasticsearch Flattened 使用
  • JS面向对象及继承
  • 【第六节】Git Flow:分支管理模型与工作流程
  • nano编辑器怎么退出并保存
  • DeepFaceLab技术浅析(六):后处理过程
  • Golang中什么是协程泄露(Goroutine Leak)
  • autok3s管理k3s单节点集群
  • [Unity] 【VR】【游戏开发】在VR中使用New Input System获取按键值的完整教程
  • 【Jenkins】pipeline 的基础语法以及快速构建一个 jenkinsfile
  • sql server索引优化语句
  • Tomcat10安装报错Unknown module: java.rmi specified to --add-opens
  • nginx-虚拟主机配置笔记
  • Python TXT文件按条件批量删除行工具
  • 静态socks5代理ip 帮助您找到最合适的ip代理服务
  • 通过阿里云 Milvus 与 PAI 搭建高效的检索增强对话系统
  • JVM基本机制
  • Java 网络编程 ①-TCP || UDP || Socket
  • [搜广推]王树森推荐系统——矩阵补充最近邻查找
  • 深度解析 HarmonyOS 中的 RichEditor:实现图文混排与交互式编辑的利器