QT实现简单的上位机软件

QT实现简单的上位机软件QT实现简单的上位机软件

大家好,又见面了,我是你们的朋友全栈君。

    最近项目要求写上位机软件,需要实现界面功能和串口读写。界面方面用过MFC(早忘记了),网上查阅资料后发现QT在5.1版本后有自带的串口模块,而且用QT实现简单界面功能很容易上手(也就期末设计随便玩过几天,约等于0基础),果断下载QT试试水。

    一开始当然先看快速入门的攻略。。网上有很多攻略就不细说了。

    自认为入门后开始想上位机软件的功能和架构,需要实现的功能模块不多,无非是:串口功能、数据处理、显示数据,然后根据这些模块设计界面。这里贴上后来设计好的界面雏形

QT实现简单的上位机软件QT实现简单的上位机软件

    由于几乎是刚接触QT,这里基本是边设计边上网查询资料。

    比如添加了按钮控件QPushButton,QT里是怎么实现按下Button后执行相关功能的?于是了解到QT中有信号(Signal)和槽(Slot)的机制。对这个机制简单的理解是,当一个Signal出现,比如按钮的按下信号click(),就会自动跳到其连接的Slot(),Slot()就是一个自己实现的函数。这跟STM32等单片机的中断有点类似,所以个人感觉比较好理解。

    所以在上位机中,“打开串口”按钮对应的Slot()就是串口类函数 QSerialPort::open() ,再进一步设置串口的波特率等参数就行了。

void MainWindow::on_SetSerialBtn_clicked()
{
    //获取当前值
    QString StrSerial = ui->SerialBox->currentText();

    //根据按钮的值判断后续操作
    if( ui->SetSerialBtn->text() == "打开串口" )
    {
        if(timer->isActive())   timer->stop();
        OpenSerial(StrSerial);
    }
    else if ( ui->SetSerialBtn->text() == "关闭串口")
    {
        CloseSerial();
        if(!timer->isActive())   timer->start(5000);
    }
}

    要打开串口,当然也要知道目前有什么串口在使用着。这里可以使用 QSerialPortInfo::availablePorts() 获得有效串口,再将有效串口以QString形式显示到上面的QComboBox空间中。


   于是到这里。。又开始查询QComboBox的相关用法,这里可以直接按F1进入QT自带的Help Mode,将所有的函数都列出来了,非常使用。这里使用到 QComboBoxdeaddItem 函数进行添加,和 currentText函数获取当前选择的值,便于打开对应的串口。

QList<QSerialPortInfo> infos = QSerialPortInfo::availablePorts();
    ui->SerialBox->clear();
    if(infos.isEmpty())
    {
        ui->SerialBox->addItem("无");
    }
    else
    {
        foreach (QSerialPortInfo info, infos)
        {
            ui->SerialBox->addItem(info.portName());
        }
    }

    这里又有问题了,因为电脑的有效串口值是会更新了,在插入新串口后应该能更新QComboBox数据。于是使用了QT自带的定时器QTimer,时间到它会发出timeout()的signal,将其连接到扫描串口的函数,就可以定时扫描串口了。

timer = new QTimer(this);
    connect(timer,SIGNAL(timeout()),this,SLOT(ScanSerialPort()));
    timer->start(5000);

    打开串口后就要读取数据了,这里使用到QSerialPort的readAll()函数,一次读完所有的值(项目的单片机是定时发送数据的)。但如果一直让程序执行读取就会阻塞,这里发现QSerialPort有个很好的设计,串口有数据时会发送readyRead()的Signal,连接到读取的相关函数即可。个人理解Signal和Slot机制可以有效防止程序阻塞,相当不错。

connect(serial, SIGNAL(readyRead()), this, SLOT(ReadSerial()));

    对数据的处理就不细说,根据自己定义的协议处理即可。处理后显示相关数据到QTableWidget空间中,这里需要用到QTableWidget的setItem(int row, int column, QTableWidgetItem *item)函数,这里要先准备好 QTableWidgetItem 类型,而且使用过程中发现一个Item只能set一次,否则会提示以下错误

QT实现简单的上位机软件

解决方法:每次setItem前都重新构造一个Item


到这里简单的上位机框架已经实现了吧。。剩下的细节和逻辑慢慢完善补充吧

   


版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/142765.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)
blank

相关推荐

  • 【新星计划】你真的了解计算机病毒吗?[通俗易懂]

    【新星计划】你真的了解计算机病毒吗?[通俗易懂]常常听说计算机病毒,但你真的了解它们吗?你知道它们长什么样子,如何抵御吗?今天由我来带你深入了解一下。

  • 详解SpringMVC执行流程[通俗易懂]

    详解SpringMVC执行流程[通俗易懂]SpringMVC执行流程SpringMVC执行流程整体如下:执行流程分析(1)浏览器提交请求到中央调度器。(2)中央调度器直接将请求转给处理器映射器。(3)处理器映射器会根据请求,找到处理该请求的处理器,并将其封装为处理器执行链后返回给中央调度器。(4)中央调度器根据处理器执行链中的处理器,找到能够执行该处理器的处理器适配器。(5)处理器适配器调用执行处理器。(6)处理器将处理结果及要跳转的视图封装到一个对象ModelAndView中,并将其返回给处理器适配器。(7)处理器适配

  • 『C#基础』调用CMD的一个小工具

    『C#基础』调用CMD的一个小工具

  • java全局变量和静态变量的区别_java局部静态变量

    java全局变量和静态变量的区别_java局部静态变量全局变量和局部变量的简介:1、全局变量:描述对象有什么(在类中定义),类中所有方法都可以使用。2、局部变量:临时保存数据(在类的方法中定义),只能在当前方法中使用。全局变量和局部变量的区别:1、作用域不同全局变量=整个类中可用局部变量=该方法内可用2、初始值不同全局变量=有初始值局部变量=无初始值3、声明上不同全局变量=在一个类中不允许声明同名变量局部变量=在一个方…

  • 优质的书源_书源网站

    优质的书源_书源网站古有弱水三千,今有三千书源。——勿埋我心三千大世界,三千书之源书源推荐:【来自于公众号的书源分类】【优质精选书源】【综合性书源】【搜索引擎式书源】【出版书书源】【有声书源】【耽美书源】书源规则

  • MySQL之字符串拼接[通俗易懂]

    MySQL之字符串拼接[通俗易懂]MySQL字符串拼接及分组字符串拼接涉及:concat,concat_ws,group_concat数据准备:CREATETABLE`app`(`app_id`intDEFAULT’0′,`version_code`intDEFAULT’0′,`download_count`intDEFAULT’0′)ENGINE=InnoDBDEFAULTCHARSET=utf8mb4COLLATE=utf8mb4_0900_ai_ci;INSER..

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号