QT工厂配置下位机工具_qt 多个按钮控制下位机-程序员宅基地

技术标签: qt  嵌入式软件开发代码库  开发语言  

QT工厂配置工具

简单用到了以下这些,都是做上位机比较常用的,记录一下,以后就可以CV大法了!

  • 串口收发
  • 读写excel
  • QT表格控件
  • 登录页面跳转
  • QT定时器
  • QT动画
  • 鼠标滚轴事件

配置界面

调试界面

初始化

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include "adminlogin.h"
#include "Conversion/conversion.h"
​
CMDPARSING_UNION cmdprotocolparsing;
​
extern bool liftlampCycleSendEnable;
extern int liftlampCycleSendnumber;
​
MainWindow* MainWindow::myMainWindow = nullptr;
​
MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    myMainWindow = this;
​
    bmainUIinit(false);//UI初始化
    bmainServerPortinit();//串口初始化
    vmainflechazo_Time_Init();//定时器初始化
    vreadInfoLineEditInit();//map表初始化
    vcmdmapInit_liftlamp();//map指令初始化->超级牛B
    vanimationInit();//动画初始化
​
    BtnConfigStatus = false;
​
    //1、注册安装事件过滤
    ui->label_test_lamp_up_img_2->installEventFilter(this);
    ui->label_test_lamp_down_img_2->installEventFilter(this);
    ui->lineEdit_liftlampID->installEventFilter(this);
​
    isSaveExcel=false;
}

串口收发

bool MainWindow::bmainServerPortinit(void)
{
    serialPort = new QSerialPort;
​
    return true;
}
​
//搜索可用的串口,并添加到串口组合框
void MainWindow::vmainSearch_SerialPorts(void)
{
    if(ui->comboBox_com->count()==0){
        ui->comboBox_com->clear();
​
        foreach(const QSerialPortInfo &info,QSerialPortInfo::availablePorts())
        {
            ui->comboBox_com->addItem(info.portName());//+info.description());
        }
    }
}
​
//从串口接收数据,存入接收区不处理,超时后再处理
void MainWindow::ReadSerialData()
{
    flechazoTime_ms = 0;
    receiveflag=true;
    rxDatas+=serialPort->readAll();
}
​
//串口接收
void MainWindow::vmainCom_recieve_data()
{
    flechazoTime_ms++;
    if((receiveflag)&&(flechazoTime_ms>=2))
    {
        receiveflag=false;
        if(ui->checkBox_select_show_hex->isChecked())    //十六进制显示
        {
             context = rxDatas.toHex();//转十六进制
             context = context.toUpper();//转大写
​
             QByteArray buffer,tmp, src;
             buffer = QByteArray::fromHex(context.toLatin1());
             for(int i=0;i<rxDatas.size();i++){
                cmdprotocolparsing.byte[i] = buffer[i];
             }
             //解析
             vprotocol_liftlamp_cmdparsing(rxDatas.size());
​
             //添加空格
             src = context.toLatin1();
             for (int i = 0; i < src.size(); i++ )
             {
                 tmp.append(src.at(i));
                 if (i % 2) tmp.append(0x20);
             }
             context = tmp;
​
        }
        else    //ASCII显示
        {
            context = QString::fromLocal8Bit(rxDatas);
        }
        //添加接收显示头
        QString timeStrLine="["+QDateTime::currentDateTime().toString("hh:mm:ss")+"][接收]:  ";
        context = timeStrLine+context;//+"\n\r";
​
        QString content = "<span style=\" color:blue;\">"+context+"</span>";
        ui->textBrowser->append(content);
​
        rxDatas.clear();
    }
}
​
//打开串口
void MainWindow::on_pushButton_com_clicked()
{
    if(ui->pushButton_com->text()=="打开串口"){
        //获取COM口
        serialPort->setPortName(ui->comboBox_com->currentText());
        //打开串口
        if(serialPort->open(QIODevice::ReadWrite))
        {
            //设置波特率
            serialPort->setBaudRate(115200);
            //设置数据位数
            serialPort->setDataBits(QSerialPort::Data8);
            //设置奇偶校验
            serialPort->setParity(QSerialPort::NoParity);
            //设置流控制
            serialPort->setFlowControl(QSerialPort::NoFlowControl);
​
            //连接槽函数
            connect(serialPort, &QSerialPort::readyRead, this, &MainWindow::ReadSerialData);
            // 设置控件可否使用
​
            ui->pushButton_com->setText("关闭串口");
        }else{
            //打开串口失败
            QMessageBox::information(this,tr("发生错误啦"),tr("打开串口失败!"),QMessageBox::Ok);
​
        }
    }else if(ui->pushButton_com->text()=="关闭串口"){
        serialPort->clear();
        serialPort->close();
        ui->pushButton_com->setText("打开串口");
    }
}
​
void MainWindow::ServerPortSendData(QString qstring_context){
    //处理成16进制
    QByteArray flechazoSend_buffer;
    QString flechazoSend_msg="";
    if ( qstring_context.indexOf(" ") > 0)
    {
        bool ok;
        char data;
        QStringList list;
        list = qstring_context.split(" ");
        for (int i = 0; i < list.count(); i++)
        {
            if (list.at(i) == " ")
                continue;
            if (list.at(i).isEmpty())
                continue;
            data = (char)list.at(i).toInt(&ok, 16);
            if (!ok)
            {
                QMessageBox::information(this, tr("提示消息"), tr("输入的数据格式有错误!"), QMessageBox::Ok);
​
                return;
            }
            flechazoSend_buffer.append(data);
        }
         flechazoSend_msg = qstring_context.toUpper();
    }
    else
    {
        QByteArray tmp, src,myqsarraydata;
        myqsarraydata=qstring_context.toLatin1();
        flechazoSend_buffer = QByteArray::fromHex(myqsarraydata);
        src = qstring_context.toLatin1();
        for (int i = 0; i < src.size(); i++ )
        {
            tmp.append(src.at(i));
            if (i % 2) tmp.append(0x20);
        }
        flechazoSend_msg = tmp;
    }
​
    //发送数据
    if (serialPort && serialPort->isOpen())
    {
        while(!serialPort->isWritable());
        qDebug()<<"**************************buf : "<<flechazoSend_buffer.toHex();
        QString timeStrLine="["+QDateTime::currentDateTime().toString("hh:mm:ss")+"][发送]:  ";
        QString content = "<span style=\" color:red;\">"+timeStrLine +flechazoSend_msg+"\n\r</span>";
        ui->textBrowser->append(content);
​
        serialPort->write(flechazoSend_buffer);
​
        //界面控制
        ui->textBrowser->setTextColor(Qt::red);
    }
    else
    {
        ui->textBrowser->append("串口并没有打开!");
        //QMessageBox::question(this, tr("提示"),QString(tr("串口并没有打开!")),QMessageBox::Ok, QMessageBox::Cancel);
    }
}
​

QT定时器

bool MainWindow::vmainflechazo_Time_Init(void)
{
    flechazoTimer_s = new QTimer;//用于1s1次的定时任务
    flechazoTimer = new QTimer;//用于串口超时接收
​
    flechazoTimer_s->start(1000);
    flechazoTimer->start(20);
​
    connect(flechazoTimer, &QTimer::timeout,this,&MainWindow::vmainCom_recieve_data);
    connect(flechazoTimer_s, &QTimer::timeout,this,&MainWindow::vmainflechazo_s);
​
    InquiryLampCurrentTimer = new QTimer;//用于1s1次的定时任务
    connect(InquiryLampCurrentTimer, &QTimer::timeout,this,&MainWindow::vTime_inquiry_lamp_current_handle);
​
    liftlampUporDown_t = new QTimer;//上下闪烁
    connect(liftlampUporDown_t, &QTimer::timeout,this,&MainWindow::vanimLampUporDown);
​
    return true;
}
​
​
//定时器中断->1s进入1次
bool MainWindow::vmainflechazo_s(void)
{
    if(!serverportstatus){
        //如果串口未连接则搜索串口
        vmainSearch_SerialPorts();
        //定时发送
        vprotocol_liftlamp_send_Auto();
    }
​
    return true;
}

鼠标事件

//2、重写eventFilter方法,点击lineEdit控件的事件
bool MainWindow::eventFilter(QObject *obj, QEvent *event)
{
    //鼠标点击时间
    if(event->type() == QEvent::MouseButtonRelease){
        if(qobject_cast<QLabel*>(obj) == ui->label_test_lamp_up_img_2)
        {
            vcmdmap_Cycle_Send_Over_ID(true);
            return true;
        }else if(qobject_cast<QLabel*>(obj) == ui->label_test_lamp_down_img_2){
            vcmdmap_Cycle_Send_Over_ID(false);
            return true;
        }
    }
    if(event->type() == QEvent::MouseButtonRelease){
​
    }
​
    return false;
}
​
//----------------------鼠标滚轴----------------------//
void MainWindow::wheelEvent(QWheelEvent *event)
{
    //如果焦点是ID就可以滚轴触发增减
    QLineEdit* lineEditFocus =
            qobject_cast<QLineEdit*>(ui->tabWidget_factory->focusWidget());
    if(lineEditFocus==ui->lineEdit_liftlampID){
        // 当滚轮远离使用者时进行放大,当滚轮向使用者方向旋转时进行缩小
        if(event->delta() > 0){
            vcmdmap_Cycle_Send_Over_ID(true);
        }else{
            vcmdmap_Cycle_Send_Over_ID(false);
        }
    }
}

全选

void MainWindow::on_pushButton_selectall_clicked()
{
    bool status;
    //全选
    if(ui->pushButton_selectall->text()=="全选"){
        status=true;
        ui->pushButton_selectall->setText("清空选择");
    }else if(ui->pushButton_selectall->text()=="清空选择"){
        status=false;
        ui->pushButton_selectall->setText("全选");
    }
​
    QObjectList checkboxList = ui->tab_produce->children();
​
    for (int i=0;i<checkboxList.count();i++) {
        QObject  *currentobject=checkboxList[i];
        if(QString(currentobject->metaObject()->className())==QString("QCheckBox"))
        {
            QCheckBox *currentcheckbox = (QCheckBox *)currentobject;
            currentcheckbox->setChecked(status);
        }
     }
}

登录界面跳转

//管理员登录
void MainWindow::on_pushButton_admin_login_clicked()
{
    if(ui->pushButton_admin_login->text()=="管理登录"){
        ui->pushButton_admin_login->setText("退出");
        MainWindow::hide();
        //跳入登录界面
        static adminlogin UI_LOGIN;
        UI_LOGIN.show();
    }else if(ui->pushButton_admin_login->text()=="退出"){
        //上锁,初始化UI
        bmainUIinit(false);
        ui->pushButton_admin_login->setText("管理登录");
    }
}

动画

//动画初始化
void MainWindow::vanimationInit(){
​
    animation_down = new QPropertyAnimation;
    animation_down->setTargetObject(ui->pushButton_into_debug_anim_lamp);
    animation_down->setPropertyName("pos");
    animation_down->setDuration(2000);
    //拿到坐标
    QPoint down_pos = ui->pushButton_into_debug_anim_lamp->pos();
    animation_down->setStartValue(down_pos);
    down_pos.setY(down_pos.y()+45);
    animation_down->setEndValue(down_pos);
​
​
    animation_up = new QPropertyAnimation;
    animation_up->setTargetObject(ui->pushButton_into_debug_anim_lamp);
    animation_up->setPropertyName("pos");
    animation_up->setDuration(2000);
    //拿到坐标
    animation_up->setStartValue(down_pos);
    down_pos.setY(down_pos.y()-45);
    animation_up->setEndValue(down_pos);
​
​
}
​
void MainWindow::vanimationLampOpen(bool status){
    if(status){//开灯
        //static QColor color = QColorDialog::getColor(Qt::black, this, "请选择颜色");
        int r = 225, g = 225, b = 225;
        //color.getRgb(&r,&g,&b);
        ui->pushButton_into_debug_anim_lamp->setStyleSheet(QString("background-color: rgb(%1,%2,%3)").arg(r).arg(g).arg(b));
    }else{//关灯
        //static QColor color = QColorDialog::getColor(Qt::black, this, "请选择颜色");
        int r = 160, g = 32, b = 240;
        //color.getRgb(&r,&g,&b);
        ui->pushButton_into_debug_anim_lamp->setStyleSheet(QString("background-color: rgb(%1,%2,%3)").arg(r).arg(g).arg(b));
    }
}
​
​
//动画,上升下降
void MainWindow::vanimLampLift(bool status){
    //标记上升或下降
    bLampUporDown_flag = status;
    vanimLampUporDown_number=0;
    //开启定时器
    liftlampUporDown_t->start(100);
​
}
​
​
//上下闪烁,定时器
void MainWindow::vanimLampUporDown(){
    if(++vanimLampUporDown_number<100){
        if(vanimLampUporDown_number%2){
            //显示控件
            if(bLampUporDown_flag){
                //上升
                ui->label_test_lamp_up_img->show();
                ui->label_test_lamp_down_img->hide();
            }else{
                //下降
                ui->label_test_lamp_down_img->show();
                ui->label_test_lamp_up_img->hide();
            }
        }else{
            //隐藏控件
            if(bLampUporDown_flag){
                //上升
                ui->label_test_lamp_up_img->hide();
            }else{
                //下降
                ui->label_test_lamp_down_img->hide();
            }
        }
​
    }else{
        ui->label_test_lamp_up_img->hide();
        ui->label_test_lamp_down_img->hide();
        vanimLampUporDown_number=0;
        liftlampUporDown_t->stop();
    }
}

指令处理

void MainWindow::vprotocol_liftlamp_send(QString value){
    //拼接字符串
    QString qstring_context = "";
    //帧头
    qstring_context.append("FB");
    //添加指令
    qstring_context.append(value);
    //添加状态
    qstring_context.append("00");
    //添加源设备
    qstring_context.append("00000000");
    //添加目标设备
    if(ui->tabWidget_factory->currentIndex()==0){
        qstring_context.append("00000000");
    }else{
        if(value=="040102"){
            qstring_context.append("00000000");
        }else{
            qstring_context.append(str_uint8_t_to_str(ucprotocollampSmallModeConvert(qstring_to_uint8(ui->lineEdit_liftlamp_ID->text()),4),4));
        }
    }
​
    //添加参数
    QString (MainWindow::*getpar)(void);
    getpar=cmdmap_liftlamp.value(cmdmap_liftlamp_parsing.value(value));
    qstring_context.append((this->*getpar)());
​
    //计算CRC
    QString str_crc=qstring_context;
    str_crc.remove(0,2);//去掉帧头
    qstring_context.append(qstrCrcCalc(str_crc).mid(2,2)+qstrCrcCalc(str_crc).mid(0,2));
    //qstring_context.append(qstrCrcCalc(str_crc));
​
    //添加帧尾
    qstring_context.append("FE");
    //发送
    ServerPortSendData(qstring_context);
}

具体的demo

gitee仓库icon-default.png?t=N7T8https://gitee.com/flechazo5201314/qtfactory

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/qianshang52013/article/details/133607490

智能推荐

分布式光纤传感器的全球与中国市场2022-2028年:技术、参与者、趋势、市场规模及占有率研究报告_预计2026年中国分布式传感器市场规模有多大-程序员宅基地

文章浏览阅读3.2k次。本文研究全球与中国市场分布式光纤传感器的发展现状及未来发展趋势,分别从生产和消费的角度分析分布式光纤传感器的主要生产地区、主要消费地区以及主要的生产商。重点分析全球与中国市场的主要厂商产品特点、产品规格、不同规格产品的价格、产量、产值及全球和中国市场主要生产商的市场份额。主要生产商包括:FISO TechnologiesBrugg KabelSensor HighwayOmnisensAFL GlobalQinetiQ GroupLockheed MartinOSENSA Innovati_预计2026年中国分布式传感器市场规模有多大

07_08 常用组合逻辑电路结构——为IC设计的延时估计铺垫_基4布斯算法代码-程序员宅基地

文章浏览阅读1.1k次,点赞2次,收藏12次。常用组合逻辑电路结构——为IC设计的延时估计铺垫学习目的:估计模块间的delay,确保写的代码的timing 综合能给到多少HZ,以满足需求!_基4布斯算法代码

OpenAI Manager助手(基于SpringBoot和Vue)_chatgpt网页版-程序员宅基地

文章浏览阅读3.3k次,点赞3次,收藏5次。OpenAI Manager助手(基于SpringBoot和Vue)_chatgpt网页版

关于美国计算机奥赛USACO,你想知道的都在这_usaco可以多次提交吗-程序员宅基地

文章浏览阅读2.2k次。USACO自1992年举办,到目前为止已经举办了27届,目的是为了帮助美国信息学国家队选拔IOI的队员,目前逐渐发展为全球热门的线上赛事,成为美国大学申请条件下,含金量相当高的官方竞赛。USACO的比赛成绩可以助力计算机专业留学,越来越多的学生进入了康奈尔,麻省理工,普林斯顿,哈佛和耶鲁等大学,这些同学的共同点是他们都参加了美国计算机科学竞赛(USACO),并且取得过非常好的成绩。适合参赛人群USACO适合国内在读学生有意向申请美国大学的或者想锻炼自己编程能力的同学,高三学生也可以参加12月的第_usaco可以多次提交吗

MySQL存储过程和自定义函数_mysql自定义函数和存储过程-程序员宅基地

文章浏览阅读394次。1.1 存储程序1.2 创建存储过程1.3 创建自定义函数1.3.1 示例1.4 自定义函数和存储过程的区别1.5 变量的使用1.6 定义条件和处理程序1.6.1 定义条件1.6.1.1 示例1.6.2 定义处理程序1.6.2.1 示例1.7 光标的使用1.7.1 声明光标1.7.2 打开光标1.7.3 使用光标1.7.4 关闭光标1.8 流程控制的使用1.8.1 IF语句1.8.2 CASE语句1.8.3 LOOP语句1.8.4 LEAVE语句1.8.5 ITERATE语句1.8.6 REPEAT语句。_mysql自定义函数和存储过程

半导体基础知识与PN结_本征半导体电流为0-程序员宅基地

文章浏览阅读188次。半导体二极管——集成电路最小组成单元。_本征半导体电流为0

随便推点

【Unity3d Shader】水面和岩浆效果_unity 岩浆shader-程序员宅基地

文章浏览阅读2.8k次,点赞3次,收藏18次。游戏水面特效实现方式太多。咱们这边介绍的是一最简单的UV动画(无顶点位移),整个mesh由4个顶点构成。实现了水面效果(左图),不动代码稍微修改下参数和贴图可以实现岩浆效果(右图)。有要思路是1,uv按时间去做正弦波移动2,在1的基础上加个凹凸图混合uv3,在1、2的基础上加个水流方向4,加上对雾效的支持,如没必要请自行删除雾效代码(把包含fog的几行代码删除)S..._unity 岩浆shader

广义线性模型——Logistic回归模型(1)_广义线性回归模型-程序员宅基地

文章浏览阅读5k次。广义线性模型是线性模型的扩展,它通过连接函数建立响应变量的数学期望值与线性组合的预测变量之间的关系。广义线性模型拟合的形式为:其中g(μY)是条件均值的函数(称为连接函数)。另外,你可放松Y为正态分布的假设,改为Y 服从指数分布族中的一种分布即可。设定好连接函数和概率分布后,便可以通过最大似然估计的多次迭代推导出各参数值。在大部分情况下,线性模型就可以通过一系列连续型或类别型预测变量来预测正态分布的响应变量的工作。但是,有时候我们要进行非正态因变量的分析,例如:(1)类别型.._广义线性回归模型

HTML+CSS大作业 环境网页设计与实现(垃圾分类) web前端开发技术 web课程设计 网页规划与设计_垃圾分类网页设计目标怎么写-程序员宅基地

文章浏览阅读69次。环境保护、 保护地球、 校园环保、垃圾分类、绿色家园、等网站的设计与制作。 总结了一些学生网页制作的经验:一般的网页需要融入以下知识点:div+css布局、浮动、定位、高级css、表格、表单及验证、js轮播图、音频 视频 Flash的应用、ul li、下拉导航栏、鼠标划过效果等知识点,网页的风格主题也很全面:如爱好、风景、校园、美食、动漫、游戏、咖啡、音乐、家乡、电影、名人、商城以及个人主页等主题,学生、新手可参考下方页面的布局和设计和HTML源码(有用点赞△) 一套A+的网_垃圾分类网页设计目标怎么写

C# .Net 发布后,把dll全部放在一个文件夹中,让软件目录更整洁_.net dll 全局目录-程序员宅基地

文章浏览阅读614次,点赞7次,收藏11次。之前找到一个修改 exe 中 DLL地址 的方法, 不太好使,虽然能正确启动, 但无法改变 exe 的工作目录,这就影响了.Net 中很多获取 exe 执行目录来拼接的地址 ( 相对路径 ),比如 wwwroot 和 代码中相对目录还有一些复制到目录的普通文件 等等,它们的地址都会指向原来 exe 的目录, 而不是自定义的 “lib” 目录,根本原因就是没有修改 exe 的工作目录这次来搞一个启动程序,把 .net 的所有东西都放在一个文件夹,在文件夹同级的目录制作一个 exe._.net dll 全局目录

BRIEF特征点描述算法_breif description calculation 特征点-程序员宅基地

文章浏览阅读1.5k次。本文为转载,原博客地址:http://blog.csdn.net/hujingshuang/article/details/46910259简介 BRIEF是2010年的一篇名为《BRIEF:Binary Robust Independent Elementary Features》的文章中提出,BRIEF是对已检测到的特征点进行描述,它是一种二进制编码的描述子,摈弃了利用区域灰度..._breif description calculation 特征点

房屋租赁管理系统的设计和实现,SpringBoot计算机毕业设计论文_基于spring boot的房屋租赁系统论文-程序员宅基地

文章浏览阅读4.1k次,点赞21次,收藏79次。本文是《基于SpringBoot的房屋租赁管理系统》的配套原创说明文档,可以给应届毕业生提供格式撰写参考,也可以给开发类似系统的朋友们提供功能业务设计思路。_基于spring boot的房屋租赁系统论文