隐藏/拓展面板/历史:
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();
}
}