码上通QT实战16--监控页面08-连接后状态处理

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()方法关闭串口。建议在析构函数或程序退出前显式关闭,避免资源泄漏。

复制代码
原创不易,打字不易,截图不易,撸码不易,整理不易,走过路过,不要错过,欢迎点赞,收藏,转载,复制,抄袭,留言,灌水,请动动你的金手指,祝您早日实现财务自由。
相关推荐
hqwest4 小时前
码上通QT实战14--监控页面06-串口设备数据初始化-
单片机·rs232·serialport·波特率·串口设备·虚拟串口设备软件·qt项目配置文件
hqwest4 小时前
码上通QT实战15--监控页面07-打开串口连接
开发语言·qt·多线程·signal·slot·emit·信号和槽
CS Beginner6 小时前
【单片机】嵌入式显示屏开发框架:QT、SDL、LVGL 深度解析
单片机·嵌入式硬件·qt
金色熊族6 小时前
MV结构下设置Qt表格的代理(2)
c++·qt
Morwit6 小时前
Qt qml创建c++类的单例对象
开发语言·c++·qt
YxVoyager6 小时前
Qt C++ :QRegularExpression 正则表达式使用详解
c++·qt·正则表达式
qq_401700416 小时前
QStackedLayout 实现遮罩层
qt
Larry_Yanan6 小时前
Qt多进程(十一)Linux下socket通信
linux·开发语言·c++·qt
weixin_462446237 小时前
Python 使用 PyQt5 + Pandas 实现 Excel(xlsx)批量合并工具(带图形界面)
python·qt·pandas