隐藏/拓展面板/历史:
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()
{//清空之前读到的ComBoboxui->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();}
}