从零开始实现自己的串口调试助手(7) -隐藏面板/刷新串口号/实现多文本

隐藏/拓展面板/历史:

ui界面操作:

选中隐藏面板按钮,勾选checkable

创建bool类型的槽函数

隐藏/拓展面板槽函数:



void Widget::on_btnHideTable_clicked(bool checked)
{
  if(checked){

      ui->btnHideTable->setText("拓展面板");
      ui->groupBoxTexts->hide();
  }
  else{

      ui->btnHideTable->setText("隐藏面板");
      ui->groupBoxTexts->show();

  }

}

隐藏/拓展面板效果演示

同理隐藏/拓展历史的槽函数如下

隐藏/拓展历史槽函数

void Widget::on_btnHideHistory_clicked(bool checked)
{
    if(checked){
        ui->btnHideHistory->setText("拓展历史");
        ui->groupBoxRecord->hide();
    }
    else{
        ui->btnHideTable->setText("隐藏历史");
        ui->groupBoxRecord->show();

    }
}

隐藏/拓展历史效果演示

当然,补充同时隐藏面板和历史也是可以的效果如下

完成串口号列表刷新
 

自定义控件实现

mycombobox.h

#ifndef MYCOMBOBOX_H
#define MYCOMBOBOX_H

#include <QComboBox>
#include <QWidget>

class MyComboBox : public QComboBox
{
    Q_OBJECT  //这个宏里面存放需要的信号和槽函数 - 让整个类具备信号与槽的能力
public:
    MyComboBox(QWidget *parent);
protected:
    void mousePressEvent(QMouseEvent *e) override; //重写鼠标被按下事件

signals:
    void  refresh();

};

#endif // MYCOMBOBOX_H

mycombobox.cpp

#include "mycombobox.h"

#include <QMouseEvent>


MyComboBox::MyComboBox(QWidget *parent):QComboBox(parent)
{

}

void MyComboBox::mousePressEvent(QMouseEvent *e)
{
    // 只有这个按键被鼠标左键按下的时候我们才发出一个信号 - 刷新串口
    if(e->button() == Qt::LeftButton)
       emit refresh();
    //其他鼠标事件让原本的处理方式实现
     QComboBox::mousePressEvent(e);
}

提升为我们自定义的控件

添加信号与槽

在widget.cpp的构造函数中,绑定信号与槽

实现槽函数

void Widget::refreshSerialName()
{
    //清空之前读到的ComBobox
    ui->comboBox_serialNum->clear();
    // 实现串口自动检测,并且显示到需要串口号的ComboBox 里面
    QList<QSerialPortInfo> serialList = QSerialPortInfo::availablePorts(); // 检测系统可行的串口,添加到列表中
    for(QSerialPortInfo serialInfo : serialList){ //遍历我们得到的列表
        qDebug() << serialInfo.portName();
        ui->comboBox_serialNum->addItem(serialInfo.portName());//将我们得到的串口名字,添加到ComboBox选项中
    }
    ui->label_SendStatus->setText("Com Refresh!");
}

实现效果

当拔出串口工具(如CH340)的时候也会刷新列表

实现多文本发送

定义槽函数:

基础方法槽函数

void Widget::on_pushButton_t1_clicked()
{
  //将多文本框的内容读取到发送框中
  ui->lineEdit_SendContext->setText(ui->lineEdit_t1->text());
  //如果左边的HEX发送被勾选了,我们就HEX格式发送
  ui->checkBox_HexSend->setChecked(ui->checkBox_t1->isChecked());
  //将信息发送
  on_btnSendContext_clicked();


}

实现效果:

可以看到要使用这种方法实现的话,需要构建9个槽函数,太啰嗦

我们可以使用一下方法优化

优化实现

初始化

创建多文本存放数组/并绑定信号与槽

(在构造函数里面创建)

    QList<QPushButton *>buttons;
    for(int i=1;i<=9;i++){
    QString btnName = QString("pushButton_t%1").arg(i);
    QPushButton * btn = findChild<QPushButton *>(btnName);
    if(btn){
      //设置属性去获得我们的文本框序号
      btn->setProperty("buttonId",i);
      buttons.append(btn);
      //位每一个按钮绑定信号与槽
      connect(btn,SIGNAL(clicked()),this,SLOT(on_command_button_clicked()));
     }
    }

槽函数

//findChild 方法用于查找具有指定类型和名称的第一个子对象

//property

定义:Qt中的property允许开发人员声明C++对象的属性,并提供了统一的方法来访问和操作这些属性。
用途:与QObject的信号和槽机制结合使用,以便在属性值更改时触发信号。使用property可以简化代码,提高可读性和可维护性。

void Widget::on_command_button_clicked()
{
   QPushButton *btn = qobject_cast<QPushButton * >(sender());
   if(btn){
   int num = btn->property("buttonId").toInt(); // 获得编号 i
   //qDebug()<<num;
   QString lineEditName = QString("lineEdit_t%1").arg(num); // 拼接出我们需要的空间名
   QLineEdit *lineEdit = findChild<QLineEdit *>(lineEditName); // 找出这个控件名对应的控件
   if(lineEdit) //if能找到这个控件
      ui->lineEdit_SendContext->setText(lineEdit->text());

   // 选择是否HEX发送
   QString checkBoxName = QString("checkBox_t%1").arg(num);
   QCheckBox *checkBox = findChild<QCheckBox *>(checkBoxName);
   if(checkBox)
     ui->checkBox_HexSend->setChecked(checkBox->isChecked());
   //发送
   on_btnSendContext_clicked();
   }
}


效果演示

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Kotlin 网络请求小例子(Ktor)

文章目录 导入依赖创建 Http 客户端 其实还是借着 Ktor 学一学 Kotlin 如何导入依赖&#xff0c;这应该是我们 Kotlin 基础专栏的最后一期了。 Ktor 是 Kotlin 官方的一个网络请求库&#xff0c;它具有优秀且精炼的 API&#xff0c;并且是跨平台的。 本教程参考自 Ktor 文档 …

f1c100s 荔枝派 系统移植

一。交叉编译环境配置 1.1下载交叉工具链&#xff1a;https://releases.linaro.org/components/toolchain/binaries/7.2-2017.11/arm-linux-gnueabi/ 1.2解压安装 在home目录下新建 工程目录&#xff1a;mkdir f1c100s_project 将windows下的gcc-linaro-7.2.1-2017.11-x86…

AI大模型日报#0606:智谱AI开源GLM-4-9B、Pika再融5.8亿

导读&#xff1a;AI大模型日报&#xff0c;爬虫LLM自动生成&#xff0c;一文览尽每日AI大模型要点资讯&#xff01;目前采用“文心一言”&#xff08;ERNIE 4.0&#xff09;、“零一万物”&#xff08;Yi-Large&#xff09;生成了今日要点以及每条资讯的摘要。欢迎阅读&#xf…

Ubuntu虚拟机安装(基于Vmware17)

Ubuntu虚拟机安装&#xff08;基于Vmware17&#xff09; Ubuntu和CentOS是两种流行的Linux发行版&#xff0c;Ubuntu默认安装了图形化桌面环境&#xff0c;对于新手来学习相对来说较为友好&#xff0c;能够满足日常的学习和使用。CentOS则通常被用于服务器环境&#xff0c;常运…

【再探】Java—Java 沙箱机制与类加载器

沙箱&#xff08;Sandbox&#xff09;机制是将Java程序限定在JVM特定的运行范围内&#xff0c;并严格限制代码对本地系统资源的访问&#xff0c;以保证代码的有效隔离&#xff0c;防止对本地系统造成破坏。 1 安全模型 类在加载过程中&#xff0c;类加载器会为类设置初始的安…

天润融通助力浪鲸卫浴,智能化革新引领客户服务新高度

头部家装品牌如何用优质服务抓住客户&#xff1f; 每年初春&#xff0c;万物复苏的同时&#xff0c;家装市场也正式进入旺季。 因为春天气温回升&#xff0c;潮气逐渐散去&#xff0c;开始进入最适合施工的季节&#xff0c;木材不易变形、油漆不易起皮&#xff0c;再加上春季…

【iOS】——Runtime学习

文章目录 一、Runtime介绍二、Runtime消息传递三、实例对象、类对象、元类对象四、isa_t结构体的具体实现五、cache_t的具体实现六、class_data_bits_t的具体实现七、Runtime消息转发动态方法解析备用接收者完整消息转发 一、Runtime介绍 iOS的Runtime&#xff0c;通常称为Obj…

人形机器人:工业领域的得力助手

人行机器人近2年显示出强劲的增长势头&#xff0c;根据最新数据预测&#xff0c;到2026年&#xff0c;中国人形机器人产业规模将突破200亿元&#xff0c;这一数字预示着人形机器人在未来社会中将扮演更加重要的角色。 在工业领域&#xff0c;由于工业环境复杂多变&#xff0c;对…

音视频直播(一)

协议基础篇 直播协议基础推流与拉流推流拉流 直播传输协议RTMP传输协议 && HTTP-FLV协议为什么RTMP做推流&#xff0c;反而很少做拉流&#xff1f;HTTP-FLV协议 RTSP协议HLS协议SRT协议 WebRTC协议应用于直播 直播协议基础 从网络上搜寻到的有关推流与拉流的示意图 从…

STM32F103VE和STM32F407VE的引脚布局

STM32F103VE vs STM32F407VE 引脚对比表 引脚 STM32F103VE STM32F407VE 备注 1 VSS VSS 地 2 VDD VDD 电源 3 VSSA VSSA 模拟地 4 VDDA VDDA 模拟电源 5 OSC_IN OSC_IN 外部时钟输入 6 OSC_OUT OSC_OUT 外部时钟输出 7 NRST NRST 复位 8 PC13 (GPIO) PC13 (GPIO) GPIO 9 PC14 (…

【MySQL】sql语句之表操作(上)

序言 在上一篇的数据库操作的内容中&#xff0c;学习了两种属性和常用的七种操作&#xff0c;学习是循序渐进的&#xff0c;库的操作学完了&#xff0c;就要开始学习表的操作了&#xff0c;而表可与数据强相关&#xff0c;比如DDL&#xff0c;即数据定义语言&#xff0c;DML&am…

JVMの静、动态绑定异常捕获JIT即时编译

在说明静态绑定和动态绑定之前&#xff0c;我们首先要了解在字节码指令的层面&#xff0c;JVM是如何调用方法的&#xff1a; 例如我有以下的代码&#xff0c;很简单就是在main方法中调用了另一个静态方法&#xff1a; public class MethodTest {public static void main(Strin…

小程序 UI 风格美不胜收

小程序 UI 风格美不胜收 小程序 UI 风格美不胜收

论文阅读《SELECTIVE DOMAIN-INVARIANT FEATURE FOR GENERALIZABLE DEEPFAKEDETECTION》

作者&#xff1a;Yingxin Lai、 Guoqing Yang1、Yifan He2、Zhiming Luo、Shaozi Li 期刊&#xff1a;ICASSP-2024 目的&#xff1a;解决泛化性的问题&#xff0c;提出了3个模块 论文整体的架构图&#xff1a;&#xff08;挑选域特征不变&#xff0c;减少对图像内容或者风格…

完全平方数

完全平方数 完全平方数动态规划 完全平方数 给你一个整数 n &#xff0c;返回 和为 n 的完全平方数的最少数量 。 完全平方数 是一个整数&#xff0c;其值等于另一个整数的平方&#xff1b;换句话说&#xff0c;其值等于一个整数自乘的积。例如&#xff0c;1、4、9 和 16 都是…

289M→259M得物包体积治理实践

一、前言 iOS应用的包体积大小是衡量得物性能的重要指标&#xff0c;过大包体积会降低用户对应用的下载意愿&#xff0c;还会增加用户的下载等待时间以及用户手机的存储空间&#xff0c;本文重点介绍在包体积治理中的新思路以及原理与实践。 二、原理介绍 Macho产物测试 我…

想要修改word文档怎么移除编辑权限?学会这两个方法,轻松搞定

日常办公和学习中&#xff0c;Word文档是我们不可或缺的工具。然而&#xff0c;有时我们可能会遇到一些设置了编辑权限的文档&#xff0c;这可能是由于文档的创建者希望控制文档的修改和传播&#xff0c;或者是因为文档在某些共享或协作环境中被设置为只读模式。在这种情况下&a…

网工内推 | 网络运维工程师,H3CIE认证优先,13薪,享股票期权

01 畅读 &#x1f537;招聘岗位&#xff1a;高级网络运维工程师 &#x1f537;职责描述&#xff1a; 1.负责线上业务网络技术运维工作&#xff0c;保障并优化线上网络质量&#xff1b; 2.规划并构建公司线上业务网络架构&#xff1b; 3.规划线上业务网络质量评估与监控体系&…

mysql中 redo日志(上)

大家好。我们知道InnoDB 存储引擎是以页为单位来管理存储空间的&#xff0c;我们进行的增删改查操作其实本质上都是在访问页面。而在真正访问页面之前&#xff0c;需要把在磁盘上的页缓存到内存中的Buffer Pool之后才可以访问。那么我们思考一个问题&#xff1a;如果我们只在内…

vue2中使用tinymce

vue2中使用tinymce的记录 本篇文章主要实现的功能&#xff1a; &#xff08;1&#xff09;【查看】时禁用编辑 &#xff08;2&#xff09;【编辑】时某些内容是不可编辑的 &#xff08;3&#xff09;【内容】前端拼接编辑器模板 &#xff08;4&#xff09;【内容】编辑器模板中…