QT中对蓝牙权限的申请,整理一下

QT中对蓝牙权限的申请,整理一下
  1. 蓝牙的连接类中,使用权限申请

    复制代码
    public:
    	static void requestBluetoothPermission(BLE_XX *instance);
    signal:
        void permessionGrant(const int status);
    
    
    void BLE_XX::requestBluetoothPermission(BLE_XX *instance)
    {
        QBluetoothPermission permission;
        permission.setCommunicationModes(QBluetoothPermission::Access);
    
        auto *app = QCoreApplication::instance();
        if (!app) {
            qWarning() << "No QCoreApplication instance";
            return;
        }
    
        // 检查当前权限状态
        Qt::PermissionStatus currentStatus = app->checkPermission(permission);
        // 有权限就直接返回
        if (currentStatus == Qt::PermissionStatus::Granted){
            s_btReady = true;
            emit instance->permessionGrant(0);
            return;
        }
    
        app->requestPermission(
            permission,
            nullptr,
            [instance](const QPermission &perm) {
                if (perm.status() == Qt::PermissionStatus::Granted) {
                    qInfo() << "Bluetooth permission granted";
                    s_btReady = true;
    
                    // QTimer::singleShot(5000, [instance](){
                    //     // instance->searchDevices();
                    //     // instance->searchIfSerachable(instance);
                    // });
                    emit instance->permessionGrant(1);
                } else {
                    qWarning() << "Bluetooth permission denied";
                    s_btReady = false;
                    emit instance->permessionGrant(2);
                }
            }
            );
    }
    
    void BLE_XX::checkBluetoothPermission()
    {
        requestBluetoothPermission(this);
    }
  2. 在主程序中调用

    复制代码
        BLE_XX *c_ble = new BLE_XX();
        engine.rootContext()->setContextProperty("c_bluetooth", c_ble);
        QObject::connect(c_ble, &BLE_XX::permessionGrant, &g1, [&g1](int status){
            switch(status){
            case 1:
                g1.changeDevice(0);
                g1.startSearchDevice();
                break;
            }
        });
        c_ble->checkBluetoothPermission();

    在此程序中,实例化时也绑定了槽,如果没有权限,在授权后需要重新实例化。在结构上,没有把权限的检查申请放在蓝牙连接类的构造函数中,因为在初次实例化时不能触发槽函数

捎带产生的另一个问题

环境没有做什么改动,在Debug模式下正常,但是切换到Release时就不正常了,提示:

复制代码
ninja: no work to do

什么也没干,因为没生成so文件的问题,无法继续。依赖习惯了自动的配置,这个还是拖了一点时间,后来比较发现,在项目中,正常应该是这样的:

复制代码
# 构建目录
/xxx/build/xx_arm64_v8a-Release
# 构建步骤
cmake --build /xxx/build/xx_arm64_v8a-Release --target all
# 清除的步骤
cmake --build /xxx/build/xx_arm64_v8a-Release --target clean

这个错误来源于构建步骤这一步出现了错误,配置成了一个不是来源的目录

复制代码
cmake --build /xxx/build/xx_arm64_v8a-Release --target xxx_other_files
相关推荐
Decay__7 分钟前
05_MySQL 常用 SQL 大全 —— 诊断、管理、优化辅助 SQL 与三大系统库速查
运维·数据库·sql·mysql·架构
学长毕设3 小时前
基于SpringBoot的实验室资产管理系统
java·spring boot·后端
zzu123zsw4 小时前
从臃肿的模板调用到声明式契约:深入 UniHttp 动态代理与多渠道生命周期扩展
java·spring boot·microsoft·unihttp
小徐不徐说4 小时前
C++ 接口与插件设计:从工厂注册到 Qt 动态插件
数据库·c++·qt·系统架构·程序设计
源码集结号5 小时前
云诊所门诊系统源码,基于SpringBoot+Vue.js架构,支持多租户设计与Docker容器化部署
java·spring boot·源码·医院信息系统·门诊系统·诊所系统
小王C语言5 小时前
Qt常用控件:容器类控件,标题分组框、标签页(浏览器标签)
开发语言·qt
论文复现现场5 小时前
WRF、FEA 能用 L40S 加速吗?求解器检查、断点恢复与长期运行
java·数据库·算法·wrf·有限元分析·gpu计算·断点续算
啃瓜子的松鼠5 小时前
泛微OAe9-后端二开异步调用
java
TMedical5 小时前
MedPlanning 截骨模拟矫形功能
c++·图像处理·人工智能·qt·健康医疗
Decay__6 小时前
04_MySQL DBA 日常运维手册 —— 会话管理、锁与阻塞、事务监控、慢查询与日志巡检
运维·数据库·sql·mysql·架构