QT入门笔记2

目录

一、前言

二、串口助手实现

2.1、串口

2.1.1、可用串口信息-QSerialPortInfo

 2.1.2、打开串口-QSerialPort

2.1.3、串口发送接收信息 

2.2、定时器-QTimer

2.3、常用属性类型转换(会更新)

2.4、子控件组规则命名优化


一、前言

这个是学习QT中实现的一个小项目——串口助手,这里是根据串口助手制作过程中所需要使用的类和插件制作的一个笔记,方便以后成为我们的技术库,很方便于我们日后开发!                          串口助手模样:

二、串口助手实现

2.1、串口

2.1.1、可用串口信息-QSerialPortInfo

每学习一个类,我们都需要去查手册,查看它的成员还有使用前提,我们才能更好的使用起来:

说明需要添加:

 函数原型:

QList<QSerialPortInfo> QSerialPortInfo::availablePorts()QList<qint32> QSerialPortInfo::standardBaudRates()

我们使用上面这个类的这两个函数就可以得到地电脑当前可使用的端口和波特率了,这里我们做个小demo将其打印出来:

#include <QSerialPortInfo>#include <QDebug> //显示可用的串口端口QList<QSerialPortInfo> serialList = QSerialPortInfo::availablePorts();for(QSerialPortInfo serialInfo : serialList)//遍历容器{qDebug() << serialInfo.portName();//打印可用的端口号ui->comboBox_serialNum->addItem(serialInfo.portName());//添加标签}//显示电脑可用的波特率QList<qint32> serialbotelv = QSerialPortInfo::standardBaudRates();for(qint32 serialbotelvInfo : serialbotelv)//遍历容器{qDebug() << serialbotelvInfo;}

运行结果:

 2.1.2、打开串口-QSerialPort

使用一个串口需要配置很多参数,相同打开一个串口也需要提前配置好参数:

QSerialPort::QSerialPort(QObject *parent = nullptr)
用给定的父对象构造一个新的串行端口对象。

使用案例:

QSerialPort *serialPort;
serialPort = new QSerialPort(this);//为串口创建一个空间

构造好串口端口对象后,接下来就是配置参数了,配置参数的函数也不难找到,在类中的public Functions里面:找到函数后,再根据函数的参数找到对应自己组要的配置即可。

这里以配置数据位为代表:

bool setDataBits(QSerialPort::DataBits dataBits)

然后在看它的参数是DataBits类型,然后我们再去手册查找 

找到公共类型点进去,找到自己要找的: 

最后再根据代码逻辑实现即可:学习QT最重要的就是学会查手册 

    //1. 选择端口号serialPort->setPortName(ui->comboBox_serialNum->currentText());//2. 配置波特率serialPort->setBaudRate(ui->comboBox_boautrate->currentText().toInt());//3. 配置数据位serialPort->setDataBits(QSerialPort::DataBits(ui->comboBox_databit->currentText().toUInt()));//4. 配置校验位switch (ui->comboBox_jiaoyan->currentIndex()) {case 0:serialPort->setParity(QSerialPort::NoParity);break;case 1:break;serialPort->setParity(QSerialPort::EvenParity);case 2:serialPort->setParity(QSerialPort::MarkParity);break;case 3:serialPort->setParity(QSerialPort::OddParity);break;case 4:serialPort->setParity(QSerialPort::SpaceParity);break;default:serialPort->setParity(QSerialPort::UnknownParity);break;}//5. 配置停止位serialPort->setStopBits(QSerialPort::StopBits(ui->comboBox_databit->currentText().toUInt()));//6. 流控if(ui->comboBox_fileCon->currentText() == "None")serialPort->setFlowControl(QSerialPort::NoFlowControl);//7. 打开串口if(serialPort->open(QIODevice::ReadWrite)){qDebug() << "serial open success";}

运行结果:

2.1.3、串口发送接收信息 

发送信息:

const char* sendData = ui->lineEditSendContext->text().toStdString().c_str();
serialPort->write(sendData);//串口发送信息
qDebug() << "SendOK" << sendData;//打印信息验证
ui->textEditRecord->append(sendData);//将发送的信息添加到历史记录文本里面

接收信息:

接收信息和单片机一样,有信息来了就会有一股“感觉”来临,这个“感觉”在QT中就是我们常用的信息了,我们要利用好这个感觉,感觉来了就处理!我们可以查看手册这个类的信息有哪些?

发现这个类中没有和接收信息相关的信息,所以我们要往上查,查他的父类(子承父业): 

所以我们还是老套路,绑定信号和槽,声明定义槽函数: (这里就不展示槽的声明了)

//串口接收信号readyRead连接
connect(serialPort,&QSerialPort::readyRead,this,&Widget::on_SerialData_readyToRead);//串口读取槽函数
void Widget::on_SerialData_readyToRead()
{QString revMessage = serialPort->readAll();qDebug() << "getMessage:"<< revMessage;ui->textEditRev->append(revMessage);//将接收的信息记录在文本上
}

2.2、定时器-QTimer

定时器和单片机中的定时器使用都是类似的,使用起来并不难,QT配合手册可以更灵活使用:

.h文件class Widget : public QWidget
{Q_OBJECTpublic:Widget(QWidget *parent = nullptr);~Widget();private slots:void on_pushButton_clicked();void on_pushButton_2_clicked();void on_checkBox_clicked();void on_checkBox_clicked(bool checked);private:Ui::Widget *ui;QTimer *timer;//定时器变量声明
};.c文件Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget)
{ui->setupUi(this);timer = new QTimer(this);//为定时器创建一个空间connect(timer,&QTimer::timeout,[=](){//定时器信号与槽绑定qDebug() << "timer out!";//时间到了干什么});
}Widget::~Widget()
{delete ui;
}//按键按下定时器开始
void Widget::on_pushButton_clicked()
{timer->start(1000);
}
//按键按下定时器结束
void Widget::on_pushButton_2_clicked()
{timer->stop();
}

运行结果:

更多使用放方法可以查看手册: 

2.3、常用属性类型转换(会更新)

    QString String_data = "hello";//QString转const char*const char* char_data = String_data.toStdString().c_str();const char* char_data2 = String_data.toLocal8Bit().constData();//QString转int,其他整数类型也是使用类似函数转换String_data.toInt();//QString转Hex显示QByteArray qtmp = String_data.toUtf8();  //QString转QByteArrayqtmp = qtmp.toHex();                     //QString转HEXString_data = QString::fromUtf8(qtmp);                 //QByteArray转QStringqDebug() << String_data;//HEX显示转QStringQString temp = String_data;QByteArray temp2 = String_data.toUtf8();      //QString转QByteArray转QStringQByteArray temp3 = QByteArray::fromHex(temp2);//由HEX返回原来本质String_data = QString::fromUtf8(temp3);       //QByteArray转QStringqDebug() << String_data;

运行结果:

2.4、子控件组规则命名优化

在QT工作开发中我们难免会使用相同的子控件来执行大差不差的工作,比如实现一个小项目串口助手中这种情况,很多数量的按键都是实现相同的功能-发送

如果作为一个小白来说,我们肯定会使用大量的信号与槽来实现,一个按键对应一对信号与槽,这样就显的代码太过于臃肿了,为了简洁,可以使用通过给子控件规则命名配合事件的使用来简单化代码: 

1.我们首先需要给子控件规则命名:

2.然后

注意:头文件中需要声明槽函数.c文件
QList<QPushButton *> buttons;
for(int i = 1; i <= 9; i++){QString btnName = QString("pushButton_%1").arg(i);//建立命名QPushButton* btn = findChild<QPushButton *>(btnName);//寻找子控件中QPushButton类中是否有btnNameif(btn){//如果有btn->setProperty("buttonId",i);//设置它的属性IDbuttons.append(btn);//统一绑定一个槽,然后在这个槽on_command_button_clicked里面进行处理connect(btn,SIGNAL(clicked()),this,SLOT(on_command_button_clicked()));}
}//槽处理
void Widget::on_command_button_clicked()
{QPushButton *btn = qobject_cast<QPushButton *>(sender());//查看谁是发送信号的按键if(btn){int num = btn->property("buttonId").toInt();//将它的属性ID转换出来QString lineEditName = QString("lineEdit_%1").arg(num);//根据ID找对应的横线文本QLineEdit *lineEdit = findChild<QLineEdit *>(lineEditName);if(lineEdit)ui->lineEditSendContext->setText(lineEdit->text());QString checkBoxName = QString("checkBox_%1").arg(num);//根据ID找对应的CheckboxQCheckBox *checkBox = findChild<QCheckBox *>(checkBoxName);if(checkBox)ui->checkBHexSend->setChecked(checkBox->isChecked());on_btnSendContext_clicked();//发送信息}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/34751.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

DeepSeek(3):DeepSeek R1 提示词⼯程

1 提示词⼯程 5W1H&#xff08;What, Who, When, Where, Why, How&#xff09;是⼀种常⽤的信息收集和指令下达的⽅法。以下是根据这个⽅法为DeepSeek R1模型下指令的例⼦&#xff0c;以“学习⼤模型应⽤开发”为例&#xff1a; &#xff08;1&#xff09;What&#xff08;是什…

Linux入门 全面整理终端 Bash、Vim 基础命令速记

Linux入门 2025 超详细全面整理 Bash、Vim 基础命令速记 刚面对高级感满满的 终端窗口是不是有点懵&#xff1f;于是乎&#xff0c;这份手册就是为你准备的高效学习指南&#xff01;我把那些让人头大的系统设置、记不住的命令都整理成了对你更友好的格式&#xff0c;让你快速学…

RBA+minibatch的尝试

目录 还是咬着牙来写 RBA了 JAX JAX->TORCH torch tensor的变形 pytorch怎么把一个【3,3,5】的tensor变成【3,10,5】&#xff0c;多的用0填充 pytorch如何把shape【100】转成【100,1】 把torch shape【100,1】变成【100】 SQUEEZE grad_fn 不能两次反向传播 还…

Jupyter notebook的安装与使用

jupyter notebook的安装需要在已经安装配置好的conda环境下 win r 打开运行窗口 输入cmd回车 在cmd窗口中输入以下命令 conda install jupyter notebook安装完成后启动 jupyter notebook 也是在cmd窗口 输入 : jupyter notebook运行成功后第一次打开的时候需要选择一个浏览…

如何在Ubuntu上构建编译LLVM和ISPC,以及Ubuntu上ISPC的使用方法

之前一直在 Mac 上使用 ISPC&#xff0c;奈何核心/线程太少了。最近想在 Ubuntu 上搞搞&#xff0c;但是 snap 安装的 ISPC不知道为什么只能单核&#xff0c;很奇怪&#xff0c;就想着编译一下&#xff0c;需要 Clang 和 LLVM。但是 Ubuntu 很搞&#xff0c;他的很多软件版本是…

特殊的数字排序

0特殊的数字排序 - 蓝桥云课 问题描述 小明被挑选去参加一个ACM比赛。他的任务是解决一个很特别的问题&#xff1a;给定一个整数数组&#xff0c;但是只能通过交换任意两个数的方式来排序。听起来很简单对吗&#xff1f;但是这个问题的难点在于&#xff0c;只有某些数字是可以…

汽车感性负载-智能高边钳位能量计算

随着汽车电子技术的发展&#xff0c;新的电子电气架构下&#xff0c;越来越多的执行部件在车身出现&#xff0c;比如电磁阀、风机、水泵、油泵、雨刮继电器等常用的执行器&#xff0c; 它们一般都表现为感性特点。驱动这些负载的最简单和最常见的方法是将它们连接到高边侧开关(…

量化交易学习笔记02:双均线策略

双均线策略示例 个股&#xff1a;中国平安 回测日期&#xff1a;2022-5-1至2023-5-1 短均线&#xff1a;5天 长无线&#xff1a;10天 代码&#xff1a; def initialize(context):# 初始化此策略# 设置我们要操作的股票池, 这里我们只操作一支股票# """标的&qu…

利用余弦相似度在大量文章中找出抄袭的文章

我前面的2篇文章分别讲了如果利用余弦相似度来判断2篇文章的相似度&#xff0c;来确定文章是否存在抄袭&#xff0c;和余弦相似度的原理&#xff0c;即余弦相似度到底是怎么来判断文章的相似性高低的等等。这一篇再说下&#xff0c;对于文章字数多和大量文章时&#xff0c;如果…

在 Kaggle 中绘制中文乱码解决

在 Kaggle 中绘制中文时&#xff0c;需要设置 Matplotlib 的字体&#xff0c;否则中文会显示为乱码。可以使用 SimHei&#xff08;黑体&#xff09;或 Microsoft YaHei&#xff08;微软雅黑&#xff09;。 解决方案 使用 matplotlib 设置中文字体在 Kaggle 安装 SimHei 字体 …

在 Ubuntu 服务器上使用宝塔面板搭建博客

&#x1f4cc; 介绍 在本教程中&#xff0c;我们将介绍如何在 Ubuntu 服务器 上安装 宝塔面板&#xff0c;并使用 Nginx PHP MySQL 搭建一个博客&#xff08;如 WordPress&#xff09;。 主要步骤包括&#xff1a; 安装宝塔面板配置 Nginx PHP MySQL绑定域名与 SSL 证书…

Linux线程

1.线程概念 在一个程序里的一个执行路线就叫做线程(thread)&#xff0c;更准确定义&#xff1a;线程是一个进程内部的控制序列 进程至少有一个执行路线&#xff0c;线程在进程内部运行&#xff0c;本质是在进程地址空间内运行&#xff0c;在Linux系统中&#xff0c;CPU眼中&a…

【TI MSPM0】GPIO学习

一、文件样例查找 以GPIO软件轮询为例 下面的四个文件夹分别为不同开发环境提供支持 二、工程导入 1.点击file-点击import project 2.点击browse 3.找到对应的文件打开&#xff0c;选择 推荐使用ticlang,能够提供更加优化的效率 点击finish 三、工程学习 1.readme 文件 &a…

二叉树的基本操作与实现:C语言深度剖析

目录 代码整体框架 1. #define _CRT_SECURE_NO_WARNINGS 2. 头文件引入 3. typedef int BTtype; 4. 二叉树节点结构体定义 二叉树的创建 1. BuyNode 函数 2. CreatNode 函数 二叉树的遍历 前序遍历 中序遍历 后序遍历 二叉树属性的计算 节点个…

深入解析 Latent Diffusion Model(潜在扩散模型,LDMs)(代码实现)

深入解析 Latent Diffusion Model&#xff1a;从传统 Diffusion Model 到高效图像生成的进化 近年来&#xff0c;生成模型在图像合成领域取得了显著进展&#xff0c;其中 Diffusion Model&#xff08;扩散模型&#xff0c;DMs&#xff09;以其出色的生成质量和理论上的稳健性逐…

线性回归原理推导与应用(五):波士顿房价预测实战

波士顿房价是一个非常经典的多元线性回归入门案例数据集。波士顿房价预测数据集包含了可能会影响房价的十三个因素&#xff0c;并给出了实际的房价&#xff08;单位为万美元&#xff09; 波士顿房价数据集数据集下载地址&#xff1a;https://www.kaggle.com/datasets/altavish…

基于CATIA二次开发的低音炮腔体容积精准计算技术详解

一、功能概述 本工具通过PySide6与CATIA V5深度集成&#xff0c;实现了低音炮上下腔体内体积的自动化测量系统。系统采用三维实体建模法进行容积计算&#xff0c;相较于传统手工计算方式&#xff0c;精度提升可达0.5%。主要功能模块包括&#xff1a; 壳体特征自动识别动态草图…

向量数据库原理及选型

向量数据库 什么是向量什么是向量数据库原理应用场景 向量数据库的选型主流向量数据库介绍向量数据库对比主流向量数据库对比表 选型建议 什么是向量 向量是一组有序的数值&#xff0c;表示在多维空间中的位置或方向。向量通常用一个列或行的数字集合来表示&#xff0c;这些数…

IE代理切换器v1.2免费版

虽然IE浏览器已经过时了&#xff0c;但很多其他浏览器&#xff0c;比如谷歌浏览器的代理服务器设置&#xff0c;都还是基于IE浏览器来进行设置的&#xff0c;如果你的工作场景需要切换不同的代理服务器来访问网络&#xff0c;那这款工具适合你&#xff0c;目前该工具可以实现IE…

模运算的艺术:从基础到高阶的算法竞赛应用

在算法竞赛中&#xff0c;模运算&#xff08;取模运算&#xff09;是一个非常重要的概念&#xff0c;尤其在处理大数、防止溢出、以及解决与周期性相关的问题时。C 中的模运算使用 % 运算符&#xff0c;但它的行为和使用场景需要特别注意。 1. 模运算的基本概念 模运算是指求一…