1、前言


2、开始干
1、连接流程回顾

2、修改连接成功后的代码

cpp
#include "monitorview.h"
#include "ui_monitorview.h"
#include <QSerialPortInfo>
#include <QSerialPort>
#include <SystemUtils.h>
MonitorView::MonitorView(QWidget *parent)
: QWidget(parent)
, ui(new Ui::MonitorView)
{
ui->setupUi(this);
SystemUtils utils;
utils.SetDropShadowEffect(ui->wdg_link_container,QColor("#33000000"),5);//设置连接设备的阴影效果
// 设置字体图标
QFont font=QFont(QString("zx_icons"),9);
// 监控状态
ui->lbl_status_title_icon->setFont(font);
ui->lbl_status_title_icon->setText(QChar(0xe807));
//串口区域的刷新按钮
QFont font2=QFont(QString("zx_icons"),11);
ui->pb_port_refresh->setFont(font2);
ui->pb_port_refresh->setText(QChar(0xe71e));
// OLED区域标题
ui->lbl_oled_title_icon->setFont(font);
ui->lbl_oled_title_icon->setText(QChar(0xe807));
//设置1-6号灯珠的图标及大小
font.setPixelSize(30);
ui->lbl_light_icon_1->setFont(font);
ui->lbl_light_icon_1->setText(QChar(0xe9e2));
ui->lbl_light_icon_2->setFont(font);
ui->lbl_light_icon_2->setText(QChar(0xe9e2));
ui->lbl_light_icon_3->setFont(font);
ui->lbl_light_icon_3->setText(QChar(0xe9e2));
ui->lbl_light_icon_4->setFont(font);
ui->lbl_light_icon_4->setText(QChar(0xe9e2));
ui->lbl_light_icon_5->setFont(font);
ui->lbl_light_icon_5->setText(QChar(0xe9e2));
ui->lbl_light_icon_6->setFont(font);
ui->lbl_light_icon_6->setText(QChar(0xe9e2));
//加载串口列表
//使用QSerialPortInfo::availablePorts()方法可以获取系统中所有可用的串口。这个方法返回一个QList<QSerialPortInfo>,其中包含了所有串口的信息
// 获取所有可用的串口信息 QList<QSerialPortInfo> ports = QSerialPortInfo::availablePorts();
foreach (const QSerialPortInfo &info, QSerialPortInfo::availablePorts()) {
ui->cb_port->addItem(info.portName());
}
//初始化波特率
ui->cb_baud->addItem("2400");
ui->cb_baud->addItem("4800");
ui->cb_baud->addItem("9600");
ui->cb_baud->addItem("19200");
ui->cb_baud->setCurrentText("9600");//设置默认选项
// 初始化校验位列表
ui->cb_parity->addItem("No");
ui->cb_parity->addItem("Odd");
ui->cb_parity->addItem("Even");
ui->cb_parity->addItem("Space");
ui->cb_parity->addItem("Mark");
ui->cb_parity->setCurrentText("No");//设置默认选项
// 初始化数据位列表
ui->cb_data->addItem("5");
ui->cb_data->addItem("6");
ui->cb_data->addItem("7");
ui->cb_data->addItem("8");
ui->cb_data->setCurrentText("8");//设置默认选项
// 初始化停止位列表
ui->cb_stop->addItem("One");
ui->cb_stop->addItem("OneAndHalf");
ui->cb_stop->addItem("Two");
ui->cb_stop->setCurrentText("One"); //设置默认选项
}
MonitorView::~MonitorView()
{
delete ui;
}
//刷新串口列表
void MonitorView::on_pb_port_refresh_clicked()
{
//加载串口列表
ui->cb_port->clear();//清空
foreach (const QSerialPortInfo &info, QSerialPortInfo::availablePorts()) {
ui->cb_port->addItem(info.portName());
}
}
//连接设备
void MonitorView::on_pb_link_clicked()
{
// QSerialPort 打开 加电 数据发送 请求
// 过程需要后台线程处理
//获取选择的串口参数
QString port=ui->cb_port->currentText();
QString baud=ui->cb_baud->currentText();
QString parity=ui->cb_parity->currentText();
QString data=ui->cb_data->currentText();
QString stop=ui->cb_stop->currentText();
// 触发连接的信号
emit onConnect(port,baud,parity,data,stop);
}
//串口打开状态
void MonitorView::setOpenState(bool state)
{
//处理状态
if(state){//连接成功
ui->pb_link->setText("断开连接");
ui->cb_port->setEnabled(false);
ui->cb_baud->setEnabled(false);
ui->cb_parity->setEnabled(false);
ui->cb_data->setEnabled(false);
ui->cb_stop->setEnabled(false);
ui->pb_send->setEnabled(true);//发送按钮可用
// 改变所有状态灯的默认颜色
ui->lbl_temp_green->setStyleSheet("background-color:'#DD00FF00';");
ui->lbl_humi_green->setStyleSheet("background-color:'#DD00FF00';");
ui->lbl_bright_green->setStyleSheet("background-color:'#DD00FF00';");
//设置灯控开关的按钮全部为可用
ui->sb_status_1->setIsEnabled(true);
ui->sb_status_2->setIsEnabled(true);
ui->sb_status_3->setIsEnabled(true);
ui->sb_status_5->setIsEnabled(true);
ui->sb_status_6->setIsEnabled(true);
ui->sb_status_7->setIsEnabled(true);
}else{//连接失败或断开连接
ui->pb_link->setText("连接设备");
ui->cb_port->setEnabled(true);
ui->cb_baud->setEnabled(true);
ui->cb_parity->setEnabled(true);
ui->cb_data->setEnabled(true);
ui->cb_stop->setEnabled(true);
ui->pb_send->setEnabled(false);//发送按钮禁用
// 恢复所有状态灯的默认颜色
//1、红色灯
ui->lbl_temp_red->setStyleSheet("background-color:'#33FF0000';");
ui->lbl_humi_red->setStyleSheet("background-color:'#33FF0000';");
ui->lbl_bright_red->setStyleSheet("background-color:'#33FF0000';");
//2、黄色灯
ui->lbl_temp_yellow->setStyleSheet("background-color:'#33FF9000';");
ui->lbl_humi_yellow->setStyleSheet("background-color:'#33FF9000';");
ui->lbl_bright_yellow->setStyleSheet("background-color:'#33FF9000';");
//3、绿色灯
ui->lbl_temp_green->setStyleSheet("background-color:'#3300FF00';");
ui->lbl_humi_green->setStyleSheet("background-color:'#3300FF00';");
ui->lbl_bright_green->setStyleSheet("background-color:'#3300FF00';");
//设置灯控开关的按钮全部为禁用
ui->sb_status_1->setIsEnabled(false);
ui->sb_status_2->setIsEnabled(false);
ui->sb_status_3->setIsEnabled(false);
ui->sb_status_5->setIsEnabled(false);
ui->sb_status_6->setIsEnabled(false);
ui->sb_status_7->setIsEnabled(false);
}
}
setStyleSheet 的基本用法
在 QT 中,setStyleSheet 是一种用于动态设置控件样式的强大方法。它允许通过类似 CSS 的语法来定义控件的视觉外观,包括颜色、字体、边框等
cpp
widget->setStyleSheet("background-color: red; color: white;");
支持的样式属性
setStyleSheet 支持多种 CSS 属性,以下是一些常用属性:
background-color:设置背景颜色color:设置文本颜色border:设置边框样式font:设置字体属性padding:设置内边距
动态样式更新
样式表可以随时动态更新,修改会立即反映在界面上:
cpp
// 根据条件动态改变样式
if (condition) {
button->setStyleSheet("color: red;");
} else {
button->setStyleSheet("color: blue;");
}


3、运行效果


4、小结
qt中的串口连接流程
创建串口对象
使用QSerialPort类创建串口对象,需包含头文件<QSerialPort>。实例化对象后,可通过setPortName()指定串口名称(如COM1或/dev/ttyS0)。
配置串口参数
调用setBaudRate()设置波特率(如QSerialPort::Baud9600),setDataBits()设置数据位(如QSerialPort::Data8),setParity()设置校验位(如QSerialPort::NoParity),setStopBits()设置停止位(如QSerialPort::OneStop),setFlowControl()设置流控(如QSerialPort::NoFlowControl)。
打开串口连接
通过open(QIODevice::ReadWrite)尝试打开串口。需检查返回值或isOpen()状态确认是否成功。失败时可调用errorString()获取错误信息。
读写数据操作
写入数据使用write()方法,如serial->write("Hello")。读取数据需连接readyRead()信号到槽函数,在槽函数中调用readAll()或readLine()获取数据。
关闭串口连接
调用close()方法关闭串口。建议在析构函数或程序退出前显式关闭,避免资源泄漏。
原创不易,打字不易,截图不易,撸码不易,整理不易,走过路过,不要错过,欢迎点赞,收藏,转载,复制,抄袭,留言,灌水,请动动你的金手指,祝您早日实现财务自由。
