1.提前准备学习
由于本人在此之前只学习过C语言,了解到QT制作会用到C++的基础部分,所以提前学习了C++,大概花费三天
接下来学习QT 推荐B站学习 基本只需要学习基本使用 后面实践才是最重要的
好啦,进入自我实践
2.开始实践
2.1各种库文件的添加
由于QT自带蓝牙库,但需要加入以下代码在.pro文件里

QT       += bluetooth

然后需要加入以下蓝牙头文件

#include <QtBluetooth/qtbluetoothglobal.h>
#include <QtBluetooth/qbluetoothlocaldevice.h>
#include <QtBluetooth/qbluetoothsocket.h>
#include <QtBluetooth/qbluetoothservicediscoveryagent.h>
#include <QtBluetooth/qbluetoothaddress.h>

需要用到的数组和各种控件

#include <QByteArray>
#include <QMainWindow>
#include <QListWidgetItem>
#include <QTextEdit>

2.2蓝牙的三个对象

    QBluetoothDeviceDiscoveryAgent *discoveryAgent;//用来对周围蓝牙进行搜寻QBluetoothLocalDevice *localDevice;//对本地设备进行操作,比如进行设备的打开,设备的关闭等等QBluetoothSocket *socket;//就是用来进行蓝牙配对链接和数据传输的
首先进行实例化localDevice = new QBluetoothLocalDevice();  //本地操作
discoveryAgent = new QBluetoothDeviceDiscoveryAgent();//用来发现扫描周围设备
socket = new QBluetoothSocket(QBluetoothServiceInfo::RfcommProtocol);//用来与蓝牙的连接和数据传输

这里设置了一个按键去触发扫描蓝牙

void MainWindow::on_BtnScan_clicked()
{ui->BtnScan->setText("开始扫描...");ui->listWidget->clear();if( localDevice->hostMode() == QBluetoothLocalDevice::HostPoweredOff)//判断开机有没有打开蓝牙{localDevice->powerOn();//调用打开本地的蓝牙设备}discoveryAgent->setInquiryType(QBluetoothDeviceDiscoveryAgent::GeneralUnlimitedInquiry);  //开启无限制搜寻模式discoveryAgent->start();//开始扫描蓝牙设备emit emit_refresh();
}

当扫描完成之后,需要将发现的设备打印到listWidget

connect(discoveryAgent,SIGNAL(deviceDiscovered(QBluetoothDeviceInfo)),this,SLOT(addBlueToothDevicesToList(QBluetoothDeviceInfo)));//发现设备后打印到addBluetoothDevicestoList的ListWidget
void MainWindow::addBlueToothDevicesToList(const QBluetoothDeviceInfo &info)
{QString label = QString("%1 %2").arg(info.address().toString()).arg(info.name());  //打印蓝牙的地址和名字到label//listWidget的finbditems用于查找列表部件是否有满足条件的项     返回值为一个满足条件的QT::MatchExactly列表  满足于上面的格式QList<QListWidgetItem *> items = ui->listWidget->findItems(label, Qt::MatchExactly);  //label填入到listWidgetif (items.empty()){QListWidgetItem *item = new QListWidgetItem(label);QBluetoothLocalDevice::Pairing pairingStatus = localDevice->pairingStatus(info.address());/* 蓝牙状态pairingStatus,Pairing枚举类型* 0:Unpaired没配对* 1:Paired配对但没授权* 2:AuthorizedPaired配对且授权 */if (pairingStatus == QBluetoothLocalDevice::Paired || pairingStatus == QBluetoothLocalDevice::AuthorizedPaired )item->setForeground(QColor(Qt::red));elseitem->setForeground(QColor(Qt::black));ui->listWidget->addItem(item); //添加item项}
}发现设备后连接设备
void MainWindow::on_listWidget_itemClicked(QListWidgetItem *item)
{ui->BtnLink->setEnabled(true);selItem = item;
}
void MainWindow::on_BtnLink_clicked()
{ui->BtnScan->setText("扫描蓝牙设备");if (selItem != NULL){QString text = selItem->text();  //获取item文本int index = text.indexOf(' ');  //查找空格在字符串里面的位置  首次出现的位置if(index == -1){return;}//分离地址和名字QBluetoothAddress Address(text.left(index));QString name(text.mid(index + 1));//类型转换QString temp = QString("%1").arg(Address.toString());ui->editRecv->append(QStringLiteral("你链接的蓝牙地址是:")+temp);ui->editRecv->append(QStringLiteral("你链接的蓝牙名字:")+name);//蓝牙蓝牙连接 读写模式socket->connectToService(Address, QBluetoothUuid(serviceUuid) ,QIODevice::ReadWrite);//连接完成后跳到bltconnect 打印完成链接connect(socket,SIGNAL(connected()),this,SLOT(bltConnected()));}}
void MainWindow::bltConnected()
{ui->editRecv->append(QStringLiteral("成功链接!"));connect(socket,SIGNAL(readyRead()),this,SLOT(bltReadMsg()));  //成功链接后,进入读模式,跳入bltReadMsgblt_connected  = true;}

然后写发送和接受数据的函数

void MainWindow::bltReadMsg()
{QByteArray get = socket->readAll();  //读到所有数据-》get 数组QTextCursor cursor = ui->editRecv->textCursor();   //设置游标cursor.movePosition(QTextCursor::End); // 末尾ui->editRecv->setTextCursor(cursor);if (ui->chkHexRecv->isChecked()){QString tstr, t;for (int i = 0; i < get.size(); ++i){t.asprintf("%02X ", get.data()[i]);tstr += t;}ui->editRecv->insertPlainText(tstr);}elseui->editRecv->insertPlainText(QString(get));   //打印数据
}
void MainWindow::on_BtnSend_clicked()  //发送按钮
{QMessageBox *msg_box= new QMessageBox(QMessageBox::NoIcon,QStringLiteral("注意"),QStringLiteral("请链接BLT"));if(blt_connected ==true){QString data = ui->editSend->toPlainText();QByteArray tba;if (ui->chkHexSend->isChecked())tba = HexStringToByteArray(data);elsetba = data.toLatin1();socket->write(tba);}elsemsg_box->exec();
}
QByteArray MainWindow::HexStringToByteArray(QString HexString)  //Hex转
{bool ok;QByteArray ret;HexString = HexString.trimmed();HexString = HexString.simplified();QStringList sl = HexString.split(" ");foreach (QString s, sl) {if(!s.isEmpty()){uint32_t td = s.toUInt(&ok, 16);int pos = ret.size();if (ok){do {ret.insert(pos, td & 0xFF);
//                    ret.append(td & 0xFF);td >>= 8;}while(td > 0);}}}qDebug()<<ret;return ret;
}

效果图如下:


关于从零开始学习qt制作蓝牙app和PC端的记录相关推荐

  1. 【深度学习 功法篇】win10操作系统PC端环境的部署(如何并存 不同的、多种版本的深度学习框架)

    [深度学习 功法篇]win10操作系统 PC端深度学习框架的搭建 摘要 1.1 Win10环境+ CUDA9.0 +CUDNN7.0+Python3.7.4+PaddlePaddle 1.6.3 1. ...

  2. 网页制作 手机端与PC端兼容

    网页制作--手机端与PC端兼容 手机端与PC端使用一套代码时,随屏幕分辨率的大小变化,会产生媒体查询并实现手机端与PC端的切换 (一套代码) <meta http-equir="Cac ...

  3. 微信app支付服务端开发记录

    微信APP支付服务端 调用接口需要注意事项: 1.签名:需要全部参数参加签名,空值去掉.(实际传递了什么参数需要,就根据实际参数进行签名) 2.签名参数:appid是申请支付功能的app对于的ID,k ...

  4. Java后端对接微信支付(微信小程序、APP、PC端扫码)非常全,包含查单、退款

    首先我们要明确目标,我们点击 微信支付官网 ,我们主要聚焦于这三种支付方式,其中JSPAI与APP主要与uniapp开发微信小程序与APP对接,而NATIVE主要与网页端扫码支付对接 1.三种支付统一 ...

  5. mblock机器人指令_mBot机器人如何通过蓝牙实现与PC端mBlock的无线通信?

    手机端与 mBot机器人 通讯的方式,想必大家都有所了解了,在手机端安装 makeblock 的一款应用软件后,通过手机蓝牙与 mBot 上面的蓝牙模块连接,二者实现蓝牙无线通信,以达到无线遥控或者自 ...

  6. 从零开始学习ThingJS之创建App对象

    1. 创建App 2. 加载场景 3. 加载地图 在数字孪生可视化行业,搭建模型以及3D场景都是让人头疼的事,但是有一个平台解决了这些难题,它就是ThingJS.作为面向物联网的3D可视化开发平台其特 ...

  7. 从零开始学习Qt(一)

    文章目录 一.Qt是什么 二.Qt的安装 三.Qt的优点 四.创建第一个程序 五.命名规范和快捷键 六.QPushButton 七.对象树 八.信号和槽 九.Lambda表达式 一.Qt是什么 Qt是 ...

  8. springmvc使用谷歌captcha生成图片验证码,并将验证码图片以二进制流的方式返回给前端(app和pc端都能调用)

    近期对登录注册与获取短信验证码的接口做了安全限制,其中一部分就用到了谷歌的captcha验证码,比如当用户连续三次登陆失败,那么之后的登录请求就需要用户输入谷歌的图形验证码.由于web端和app端调用 ...

  9. vue app扫PC端二维码登录

    通过接口获取二维码唯一标识,例如:qrcodeId 通过 qrcodejs2插件生成 二维码(二维码内容就是 qrcodeId,具体根据APP 需要) 循环调用接口,查看扫码状态(app是否扫码确认登 ...

最新文章

  1. 再次理解信号采样定理(低通抽样定理)
  2. android中按钮间隔,Android布局有2个均匀间隔的按钮
  3. k8s组件说明:主要组件统一说明
  4. L1-046 整除光棍 (20分)(模拟除法竖式求商的位运算)
  5. Drools可执行模型还活着
  6. Django ORM 数据库操作
  7. Thymeleaf 的使用
  8. HDU1598 find the most comfortable road【枚举+并查集+最大生成树】
  9. tp5连接mongo和mysql_tp5(thinkPHP5)操作mongoDB数据库的方法
  10. 计算机组成原理—Cache写策略
  11. cartographer探秘第四章之代码解析(六) --- 后端优化 --- 优化求解
  12. oracle dmp 编码问题,Oracle imp导入dmp文件时 IMP-00038:无法转换为环境字符集句柄
  13. 微信小程序:数据传输长度已经超过最大长度 1048576 的错误
  14. Switch函数的使用
  15. 深股通,沪股通,港股通
  16. 代理服务器拒绝连接(无法连接到代理服务器)的解决办法
  17. 根本原因分析: 五个为什么 (5 Whys)
  18. 华清远见嵌入式培训_第一周回顾与反思
  19. describe函数的参数举例详解
  20. 32位嵌入式微处理器一览

热门文章

  1. 校园无线网络规划与设计
  2. vue用vis插件实现网络拓扑图
  3. windows系统封装
  4. web前端,数据库,jdbc
  5. 计算机课程教材技校,如何编写技工学校计算机程序设计课程校本教材
  6. 【趣味编程】Python钢琴自动弹奏《月亮代表我的心》| 情人节特辑 程序员的浪漫
  7. Python实现最短路问题常见求解算法1——Label Correcting Algorithm(deque)
  8. html折叠菜单列子,javascript实例教程(2) 创建折叠式导航菜单_javascript教程
  9. 公钥如何在服务器上注册,如何将SSH公钥添加到服务器
  10. P1099 树的直径 DFS + 二分 / 尺取法