从零开始实现自己的串口调试助手(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();
   }
}


效果演示

最近更新

  1. TCP协议是安全的吗?

    2024-06-07 04:08:01       18 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-06-07 04:08:01       19 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-06-07 04:08:01       19 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-06-07 04:08:01       20 阅读

热门阅读

  1. 防抖和节流

    2024-06-07 04:08:01       9 阅读
  2. Android 各分区简介

    2024-06-07 04:08:01       10 阅读
  3. 分账能为电商平台带来哪些便捷?

    2024-06-07 04:08:01       10 阅读
  4. HElib 使用样例

    2024-06-07 04:08:01       10 阅读
  5. YT-DLP 超好用的开源视频下载工具

    2024-06-07 04:08:01       11 阅读
  6. python 滑雪小游戏代码

    2024-06-07 04:08:01       9 阅读
  7. 设计模式-状态模式

    2024-06-07 04:08:01       9 阅读
  8. 图像处理知识积累

    2024-06-07 04:08:01       8 阅读