0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

嵌入式Qt-做一个秒表

码农爱学习 来源:码农爱学习 作者:码农爱学习 2022-09-08 08:52 次阅读

之前的文章:嵌入式Qt-动手编写并运行自己的第1个ARM-Qt程序

介绍了如何编写第一个嵌入式Qt程序,实现了一个电子时钟的演示。

本篇,继续进行Qt实践,仿照手机中的秒表,实现一个相同功能的秒表:

pYYBAGMYocqAKF6_AACMff25EU8588.png

回顾上一次的Qt开发流程,整个Qt的开发都是通过敲代码实现的,实际上,还可以利用Qt Creater的UI界面功能,通过图像化的配置来开发图形界面,本篇就使用这种方法来进行开发。

1 新建Qt工程

Qt工程创建的具体步骤可参照之前的文章:嵌入式Qt-动手编写并运行自己的第1个ARM-Qt程序,这里只说明不同之处。

上篇是通过代码实现页面设计的,本篇要借助Qt Creater的UI界面设计功能,因此要把下面的创建页面勾选上:

poYBAGMYodWAbbNBAAAVYQhj74w813.png

创建完成之后的Qt默认工程结构如下:

poYBAGMYodyAUYvJAABS9eJqAC0346.png

双击widget.ui,即可打开UI设置页面,如下图:

pYYBAGMYoeaAfmpPAABUaVyEGTA365.png

这里先简单熟悉下各个功能区:

pYYBAGMYofGAakADAAC0mLFhv5w339.png

2 代码编写

2.1 ui界面设计

修改界面的尺寸,我的Linux板子屏幕的分辨率是800x480,因此调整到对应的尺寸:

poYBAGMYofiAJwD3AAAz6-wdrls642.png

从左侧拖入一个Label,然后可以修改字体的大小:

pYYBAGMYogCAVODwAACW9a1ezd8024.png

再从左侧拖入其它需要用到的组件(PushButtonTextBrower)和位置调节组件(弹簧形状的HorizontalSpacerVericalSpacer

poYBAGMYogyAPaGeAABk7T4Yfq0386.png

进行水平布局和竖直布局,选中对应的组件,例如3个按钮和中间的2个弹簧,点击上方工具栏中的水平布局按钮:

poYBAGMYohqAGAk_AAAhCartyJQ871.png

3个按键的水平布局效果如下:

poYBAGMYoiaAbDV9AAAcVO_PB5g439.png

然后再依次对其它组件进行布局:

pYYBAGMYojSAVEUSAAAby8VKkyE497.png

字体可以调整到居中显示:

poYBAGMYojuAFOUBAABbnHn0QBM686.png

鼠标选中最大的组合组件,拖拽边缘调整到合适的外尺寸。然后选中不同级别的组合组件,调整layoutStretch的参数,实现按比例显示各个组件(相当于调节各个弹簧组件的弹力大小)

poYBAGMYokSAGKhtAABRudWmlZk245.png

点击左下角上面那个三角图标,运行,查看效果:

pYYBAGMYolCADrYEAACSE98w9dQ094.png

注意左边留的空白是给秒表的表盘留的。

2.2 QTimer与QTime介绍

QTimer 类为定时器提供了一个高级编程接口,提供重复和单次计时。

QTime 类提供时钟时间功能,QTime 对象包含一个时钟时间,它可以表示为自午夜以来的小时数、分钟数、秒数和毫秒数。

Qt Creater提供了方便的帮助文档,可以在Qt Creater中直接查看对应功能函数的使用,比如搜索QTimer,就可以看到对应的介绍,以及可用的API函数:

poYBAGMYolmAdZpYAACeGqEGDNY956.png

本篇需要用到QTimer的功能有:

start:启动定时器

stop:停止定时器

再看看QTime的介绍:

pYYBAGMYomKAKUNsAAB2W98x1wc846.png

本篇需要用到QTime的功能有:

setHMS:设置初始时间

addMSecs:增加一个时间(毫秒单位)

toString:时间转为字符串格式

minute:获取分钟

second:获取秒

msec:获取毫秒

2.3 对应按钮的函数

为了编写出更易看懂的代码,在编写代码之前,需要修改对应的组件的默认名称为便于理解的名称,比如我将3个按键的名称分别改为了:

Btn_Start:开始按钮,并同时具有暂停/继续功能

Btn_Reset:复位按钮

Btn_Hit:打点按钮,用于记录不同名次的时间

poYBAGMYomyAB6lsAABeklD31BM999.png

然后还要手动添加QTimer和QTime对象,用于实现秒表的计时功能:

pYYBAGMYonWAPtfyAABfjRbQhi8570.png

2.3.1 开始按钮的处理

Qt编程中重要处理就是信号和槽机制,它可用通过手动通过connet函数实现,而对于使用Qt Creater的图形界面设计方式,通常也是继续通过界面实现信号和和槽的连接:在开始按钮上右键,选则“转到槽...”:

poYBAGMYonyACVNCAAAsoHC1470473.png

然后有多种按钮信号可以选择,因为开始按钮同时具有暂停/继续的功能,这里使用toggled功能,利用按钮的按下和松开状态,来实现暂停/继续的功能:

pYYBAGMYooeALfzVAAAr257QdaU300.png

点击OK之后,会自动跳到到代码页面,并自动生成对应的槽函数框架,然后就可以在里面编译对应的业务逻辑代码了:

poYBAGMYopCAEGjqAAA-JkOJSOQ278.png

开始按钮的具体业务逻辑代码如下,当首次按下时,checked为true,此时启动timer,记录此时的时间戳,然后将按钮的文字显示为“暂停”,同时将复位和打点按钮置灰,使这两个按钮不能再按下,因为暂停的时候执行复位和打点无意义。

timer每隔一段时间会触发超时,这里ADD_TIME_MSEC设置的是30ms,超时时间到后,编写对应的超时处理函数timeout_slot以及声明对应的信号和槽的处理。

void Widget::on_Btn_Start_toggled(bool checked)
{
    if (checked)
    {
        timer.start(ADD_TIME_MSEC);
        lastTime = QTime::currentTime();//记录时间戳
        ui->Btn_Start->setText("暂停");
        ui->Btn_Reset->setEnabled(false);
        ui->Btn_Hit->setEnabled(true);
    }
    else
    {
        timer.stop();
        ui->Btn_Start->setText("继续");
        ui->Btn_Reset->setEnabled(true);
        ui->Btn_Hit->setEnabled(false);
    }
}

connect(&timer, SIGNAL(timeout()), this, SLOT(timeout_slot()));
void Widget::timeout_slot()
{
    //qDebug("hello");
    QTime nowTime = QTime::currentTime();
    time = time.addMSecs(lastTime.msecsTo(nowTime));
    lastTime = nowTime;
    ui->Txt_ShowTime->setText(time.toString("mm:ss.zzz"));
}

超时时间到了之后,计算一些两次的时间差值,然后通过addMSecs函数来累加时间。

2.3.2 复位按钮的处理

复位按钮也是通过右键来调整到槽,注意这里使用clicked函数即可,因为复位按钮只需要使用它的点击按下功能:

poYBAGMYot-Add69AAAlgDZ8RpM426.png

对应的槽函数的具体实现如下:

void Widget::on_Btn_Reset_clicked()
{
    m_iHitCnt = 0;
    timer.stop();
    time.setHMS(0,0,0,0);
    ui->Txt_ShowTime->setText("00:00:00");
    ui->Txt_ShowItem->clear();

    ui->Btn_Start->setText("开始");
    ui->Btn_Start->setChecked(false);
    ui->Btn_Reset->setEnabled(false);
    ui->Btn_Hit->setEnabled(false);
}

主要是将时间归零,将显示情况,并将各个按钮的显示状态复位为默认显示状态。

2.3.3 打点按钮的处理

打点按钮与复位按钮一样,也是只使用clicked函数即可,对应的槽函数的具体实现如下:

void Widget::on_Btn_Hit_clicked()
{
    QString temp;
    m_iHitCnt++;
    temp.sprintf("--计次 %d--", m_iHitCnt);
    ui->Txt_ShowItem->setFontPointSize(9);
    ui->Txt_ShowItem->append(temp);
    ui->Txt_ShowItem->setFontPointSize(12);
    ui->Txt_ShowItem->append(time.toString("[mm:ss.zzz]"));
}

打点功能用于在秒表的运行过程中,记录不同名次的时间,并显示在右侧的文本显示框中。

这里通过setFontPointSize函数来设置不同大小的字体显示。

2.4 秒表表盘的实现

之前这篇文章:嵌入式Qt-动手编写并运行自己的第1个ARM-Qt程序,通过代码的方式,实现了一个时钟表盘的显示,本篇在这个的基础上,修改代码,实现一个显示秒和分的秒表表盘,具体修改后的代码如下:

connect(&timer, SIGNAL(timeout()), this, SLOT(update()));
connect(ui->Btn_Reset, SIGNAL(clicked()), this, SLOT(update()));

void Widget::paintEvent(QPaintEvent *event)
{
    int side = qMin(width(), height());
    //QTime time = QTime::currentTime();

    QPainter painter(this);
    painter.setRenderHint(QPainter::Antialiasing);
    painter.translate(width()/3, height()*2/5); //画图的基准位置
    painter.scale(side/300.0, side/300.0); //随窗口尺寸自动缩放

    //表盘(3个同心圆)
    for (int i=0; i;>

主要修改是将之前的小时显示去掉,并改为两个时间环:外圈秒环和内圈分环,秒环的范围是0~60秒,分环的范围是0~30分。

秒表表盘的显示效果如下:

poYBAGMYowuAU9kWAABILtiglFg047.png

3 编译运行

代码是在Window环境中的Qt Creater中编写的,首先是Windows中编译查看效果。

3.1 Windows中编译

在Windows中的运行效果如下图的右图,可以实现手机中秒表类似的计时效果:

pYYBAGMYocqAKF6_AACMff25EU8588.png

3.2 Ubuntu中编译

将Windows中的QT工程源码:

.cpp文件

.h文件

.pro文件

.ui文件

复制到Ubuntu中,注意.user文件是不需要的(它是Windows平台的编译配置)。

然后使用ARM平台的编译工具链,我的是在”/home/xxpcb/myTest/imx6ull/otherlib/qt/qt-everywhere-src-5.12.9/arm-qt/“,这里需要先用到它的qmake工具先自动生成Makefile文件,再通过make指令进行编译

使用qmake生成Makefile,进入程序源码目录,执行qmake指令:

/home/xxpcb/myTest/imx6ull/otherlib/qt/qt-everywhere-src-5.12.9/arm-qt/bin/qmake

成功执行之后,就可以看到自动生成的Makefile文件,然后执行make指令进行编译得到可执行文件。

3.3 Linux板子中运行

将可执行文件放到已配置了qt运行环境的Linux板子中,运行并查看效果:

pYYBAGMYoyOAOmHkAAJGMqNBo-4004.png

注:

Ubuntu中的具体编译过程,可参考之前这篇文章:嵌入式Qt-动手编写并运行自己的第1个ARM-Qt程序

Ubuntu中Qt的交叉编译环境的配置,可参考之前这篇文章:嵌入式Linux-Qt环境搭建

4 总结

本篇通过一个秒表的实例,介绍了如何使用Qt Creator的UI界面设计功能,进行Qt的开发,并将代码进行交叉编译,放入i.MX6ULL的Linux环境中测试运行情况。

审核编辑:汤梓红

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 嵌入式
    +关注

    关注

    5091

    文章

    19176

    浏览量

    307264
  • Qt
    Qt
    +关注

    关注

    1

    文章

    308

    浏览量

    38044
  • 秒表
    +关注

    关注

    3

    文章

    77

    浏览量

    22047
收藏 人收藏

    评论

    相关推荐

    嵌入式Qt-实现两窗口的切换

    本篇介绍了介绍了QStackedWidget的使用,通过这个类,实现了Qt时钟和Qt秒表这两页面可以随意切换。
    的头像 发表于 09-09 09:03 2764次阅读
    <b class='flag-5'>嵌入式</b><b class='flag-5'>Qt-</b>实现两<b class='flag-5'>个</b>窗口的切换

    嵌入式Qt-交叉编译FFmpeg与视频播放测试

    本篇介绍了嵌入式Qt播放视频的准备工作:交叉编译FFmpeg库并移植到Linux板子中,并先通过ffmpeg指令测试视频播放效果。下篇将尝试设计Qt界面来结合FFmpeg进行视频的播放。
    的头像 发表于 09-15 02:08 2524次阅读
    <b class='flag-5'>嵌入式</b><b class='flag-5'>Qt-</b>交叉编译FFmpeg与视频播放测试

    嵌入式Qt-表格使用测试

    本篇介绍了Qt中QTable Widget这个表格组件的使用,后续可增加SQLite数据库功能,利用表格可以直观的展示出嵌入式设备的数据库中的数据信息。
    的头像 发表于 05-14 12:27 1657次阅读
    <b class='flag-5'>嵌入式</b><b class='flag-5'>Qt-</b>表格使用测试

    嵌入式QT的内核分析与优化

    本文给出了QT嵌入式版本(QT/E)与其它嵌入式GUI 工具箱在性能、结构上的比较,从宏观上分析了QT/E 的优点及不足之处,对
    发表于 06-22 08:30 17次下载

    基于Qt嵌入式Linux通讯簿程序设计

      摘 要: 随着嵌入式系统的发展,在Linux 下使用Qt 开发嵌入式应用程序是嵌入式图形用户界面( GUI) 系统应用研究的重点。通过
    发表于 11-23 11:31 3637次阅读

    Qt嵌入式图形开发(基础篇)

    Qt嵌入式图形开发(基础篇)对Qt/embedded来说是很好的入门和提高教程
    发表于 12-16 17:14 51次下载

    嵌入式linux GUI-Qt解析

    职业培训班》二期课程中嵌入式linux应用开发方面的重要内容。不少学员对QT方面的内容比较关注,所以在这里我们先对QT下简单介绍。 QT
    发表于 11-01 16:53 1次下载

    基于嵌入式ARM的信号采样及QT图形显示

    基于嵌入式ARM的信号采样及QT图形显示(嵌入式开发技术图解)-该文档为基于嵌入式ARM的信号采样及QT图形显示总结文档,是
    发表于 08-04 10:28 9次下载
    基于<b class='flag-5'>嵌入式</b>ARM的信号采样及<b class='flag-5'>QT</b>图形显示

    嵌入式LINUX的Qt开发入门教程

    嵌入式LINUX的Qt开发入门教程(最好的嵌入式开发板)-该文档为嵌入式LINUX的Qt开发入门总结文档,是
    发表于 08-04 11:01 30次下载
    <b class='flag-5'>嵌入式</b>LINUX的<b class='flag-5'>Qt</b>开发入门教程

    嵌入式linux安装qt

    嵌入式linux部署qt几个疑问在windows系统里编好的QT程序,经过交叉编译后能直接运行在板子上吗?还是板子需要弄个QT环境啥的?就是往里面安
    发表于 10-20 18:06 6次下载
    <b class='flag-5'>嵌入式</b>linux安装<b class='flag-5'>qt</b>

    嵌入式Linux的Qt

    嵌入式Linux的Qt嵌入式Linux的Qt配置特定设备嵌入式Linux设备的平台插件EGLFSLinuxFB输入使用libinput鼠标M
    发表于 11-01 17:06 3次下载
    <b class='flag-5'>嵌入式</b>Linux的<b class='flag-5'>Qt</b>

    嵌入式Linux的QT版本,嵌入式Linux版本Qt5.4快速部署

    关键词:摘要:Qt领先的跨平台应用和UI 开发框架(Framework),使用标准C++,适用于桌面,嵌入式和移动平台。本文着重就利用Boot to
    发表于 11-01 17:20 0次下载
    <b class='flag-5'>嵌入式</b>Linux的<b class='flag-5'>QT</b>版本,<b class='flag-5'>嵌入式</b>Linux版本<b class='flag-5'>Qt</b>5.4快速部署

    嵌入式Linux应用程序开发-(1)第一个嵌入式QT应用程序

    一个嵌入式QT应用程序在成功安装 Qt Creator 开发环境后,我们通过简单的
    发表于 11-01 17:21 16次下载
    <b class='flag-5'>嵌入式</b>Linux应用程序开发-(1)第<b class='flag-5'>一个</b><b class='flag-5'>嵌入式</b><b class='flag-5'>QT</b>应用程序

    嵌入式linux安装qt,嵌入式Linux版本Qt5.4快速部署

    摘要:Qt领先的跨平台应用和UI 开发框架(Framework),使用标准C++,适用于桌面,嵌入式和移动平台。本文着重就利用Boot to
    发表于 11-02 10:51 0次下载
    <b class='flag-5'>嵌入式</b>linux安装<b class='flag-5'>qt</b>,<b class='flag-5'>嵌入式</b>Linux版本<b class='flag-5'>Qt</b>5.4快速部署

    Qt 嵌入式图形开发大全和QT开发手册

    说,下面是基本简介,还有他们的嵌入式技术交流群:787059199,有兴趣的朋友可以加加,起交流,这个资料也能找到,QT手册的没有放出来,但是链接里面有,可以去看看下载链接:https://bbs....
    发表于 11-03 09:51 21次下载
    <b class='flag-5'>Qt</b> <b class='flag-5'>嵌入式</b>图形开发大全和<b class='flag-5'>QT</b>开发手册