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

news2024/9/20 1:14:48

介绍了如何搭建在Linux开发板中搭建Qt的运行环境,并测试了Qt自带的例程。

本篇,来介绍如何自己编写一个Qt程序,并将编译结果放到Linux开发板中运行。

1 Windows上编写Qt程序

因为Qt是支持跨平台的,所以我们可以先在Windows平台上编写和查看Qt的运行效果,然后再通过交叉编译,编译出ARM Linux平台的可执行文件,最终放到开发板中查看运行结果。

Windows上需要安装Qt Creator软件来开发Qt程序,该软件的安装过程,和大多数软件的安装过程都差不多,在此不再演示安装过程。

下面介绍如何创建一个Qt工程。

1.1 新建Qt工程

Qt Creator本质也是一个集成开发环境,与Visual Studio之类的创建工程的流程类似,其软件界面如下:

创建工程,选择左上角菜单中的“文件”->"新建文件或项目",弹出如下窗口,然后默认选择Qt Widgets Application,然后右下加点击“Choose"按键:

出现选择项目工程的存放位置,然后再下一步:

这里会用到Visual Studio中的一些功能,默认即可,然后下一步:

然后要选择类信息,基类里可选的有QMainWindow、QWidget和QDialog,这里我们选择QWidget。

下面还有一个”创建界面“的勾选框,那个是用来通过图形化的方式设计显示界面,本篇暂用不到,先取消勾选,然后点下一步

到这里,Qt工程就创建好了,点完成:

创建的Qt工程如下,主要包含4个文件:

  • clock.pro:Qt工程的配置文件
  • main.cpp:主程序
  • widget.cpp:窗口程序
  • widget.h:窗口程序的头文件

1.2 代码编写(时钟程序)

Widget的构造函数

Widget::Widget(QWidget *parent)
    : QWidget(parent)
{
    QTimer *timer = new QTimer(this);
    connect(timer, SIGNAL(timeout()), this, SLOT(update()));
    timer->start(1000);
​
    setWindowTitle(tr("Clock"));
    setMinimumSize(200, 200); //设置最小尺寸
}

首先创建了一个Qt的定时器,设置超时时间为1s(1000ms),超时时间到,更新表盘的显示。

第2行是Qt中最常用的信号和槽机制:

connect(timer, SIGNAL(timeout()), this, SLOT(update()));

信号和槽,简单的立即,就是信号SIGNAL出现后(1s定时器超时),触发槽SLOT函数执行(更新表盘的显示)

界面设计

时钟程序中的表盘,表针等,都是通过画图的方式实现的,具体的代码如下:

void Widget::paintEvent(QPaintEvent *event)
{
    int side = qMin(width(), height());
    QTime time = QTime::currentTime();
​
    QPainter painter(this);
    painter.setRenderHint(QPainter::Antialiasing);
    painter.translate(width()/2, height()/2); //画图的基准位置
    painter.scale(side/200.0, side/200.0); //随窗口尺寸自动缩放
​
    //表盘
    for (int i=0; i<PANEL_RADIUS_NUM; i++)
    {
        QBrush brush(stPanelParaArr[i].color);
        QPen pen(stPanelParaArr[i].color);
        painter.setBrush(brush);
        painter.setPen(pen);
        painter.drawEllipse(-stPanelParaArr[i].radius, -stPanelParaArr[i].radius, 2*stPanelParaArr[i].radius, 2*stPanelParaArr[i].radius);
    }
​
    //小时的表针
    painter.setPen(Qt::NoPen);
    painter.setBrush(hourColor);
​
    painter.save();
    painter.rotate(30.0 * ((time.hour() + time.minute() / 60.0)));
    painter.drawConvexPolygon(hourHand, 3);
    painter.restore();
​
    //小时的刻度
    painter.setPen(hourColor);
    for (int i = 0; i < 12; ++i)
    {
        painter.rotate(30.0);
        painter.drawLine(PANEL_RADIUS3-6, 0, PANEL_RADIUS3, 0);
        QFont font("TimesNewRoman", HOUR_NUM_SIZE);
        painter.setFont(font);
        painter.drawText(-HOUR_NUM_SIZE, -(CLOCK_RADIUS-15), 2*HOUR_NUM_SIZE, 2*HOUR_NUM_SIZE, Qt::AlignHCenter, QString::number(i+1));
    }
​
    //分钟的表针
    painter.setPen(Qt::NoPen);
    painter.setBrush(minuteColor);
​
    painter.save();
    painter.rotate(6.0 * (time.minute() + time.second() / 60.0));
    painter.drawConvexPolygon(minuteHand, 3);
    painter.restore();
​
    painter.setPen(minuteColor);
    for (int j = 0; j < 60; ++j)
    {
        if ((j % 5) != 0)
        {
            painter.drawLine(PANEL_RADIUS3-4, 0, PANEL_RADIUS3, 0);
        }
        painter.rotate(6.0);
    }
​
    //秒钟的表针
    painter.setPen(Qt::NoPen);
    painter.setBrush(secondColor);
​
    painter.save();
    painter.rotate(6.0 * time.second());
    painter.drawConvexPolygon(secondHand, 3);
    painter.restore();
​
    painter.end();
}

第2句:

QTime time = QTime::currentTime();

是来获取系统的当前时间。

1.3 编译运行

现在Windows平台中编译运行,查看效果:

该时钟是可以根据窗口大小的变化,自动进行放到或缩小显示的:

2 Ubuntu中交叉编译Qt

Windows中测试通过后,就需要编译出能够在ARM平台运行的可执行程序了,这里需要在Ubuntu中进行编译。

2.1 复制源文件到Ubuntu中

将Windows中的QT工程源码,复制到Ubuntu中,注意.user文件是不需要的,这个是Windows平台的编译配置。

复制到Ubuntu中的合适位置:

2.2 交叉编译

编译ARM平台的Qt程序,需要使用ARM平台的编译工具链。

上篇文章,在搭建Qt环境,编译Qt源码时,已经生成了ARM平台的Qt编译工具链,其位置是在上篇文章介绍的make install那一步的安装位置,我的是在”/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指令进行编译:

make

编译完可以看到可执行文件clock。

我们可以再使用file命令查看该可执行文件的平台信息:

file clock

可以看到该可执行文件是ARM平台的。

3 Linux开发板中运行Qt程序

3.1 复制可执行文件到开发板中

此次测试,仍然使用的是网络位置挂载根文件系统的方式,通过如下指令将可执行文件复制到根文件系统中(开发板中):

sudo cp clock ~/myTest/nfs/rootfs/myProj/qt/mytest/

3.2 查看开发板中的运行效果

然后就可以在开发板中执行该程序,查看效果了:

./clock

运行效果如下:

由于板子的网络时间还不能正确获取,这里显示的时间其实是不对的,不过表针仍然会1秒1秒的走动。

4 总结

本篇详细介绍了如何自己编写一个Qt程序,如何通过交叉编译,最终放到开发板中执行的过程

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1367760.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

一天一个设计模式---单例模式

概念 单例模式是一种创建型设计模式&#xff0c;其主要目的是确保一个类只有一个实例&#xff0c;并提供一个全局访问点。这意味着在应用程序中的任何地方&#xff0c;只能有一个实例存在&#xff0c;而不会创建多个相同类型的实例。 具体内容 单例模式通常包括以下几个要素…

深度学习:图神经网络——在推荐系统中的应用

PinSage是工业界应用图神经网络完成推荐任务的第一个成功案例&#xff0c;其从用户数据中构造图&#xff08;graph&#xff09;的方法和应对大规模图而采取的实现技巧都值得我们学习。PinSage被应用在图片推荐类Pinterest上。在Pinterest中&#xff0c;每个用户可以创建并命名图…

工程管理系统功能设计与实践:实现高效、透明的工程管理

在现代化的工程项目管理中&#xff0c;一套功能全面、操作便捷的系统至关重要。本文将介绍一个基于Spring Cloud和Spring Boot技术的Java版工程项目管理系统&#xff0c;结合Vue和ElementUI实现前后端分离。该系统涵盖了项目管理、合同管理、预警管理、竣工管理、质量管理等多个…

深入了解网络流量清洗--使用免费的雷池社区版进行防护

​ 随着网络攻击日益复杂&#xff0c;企业面临的网络安全挑战也在不断增加。在这个背景下&#xff0c;网络流量清洗成为了确保企业网络安全的关键技术。本文将探讨雷池社区版如何通过网络流量清洗技术&#xff0c;帮助企业有效应对网络威胁。 ![] 网络流量清洗的重要性&#x…

Wpf 使用 Prism 实战开发Day08

备忘录页面设计 1.效果图 一.布局设计跟第7章节一样&#xff0c;只是内容方面发生变化&#xff0c;其他样式都一样。直接把代码粘出来了 MemoView.xaml 页面代码 <UserControl x:Class"MyToDo.Views.MemoView"xmlns"http://schemas.microsoft.com/winfx/2…

jQuery页面整屏滚动

效果展示 jQuery页面整屏滚动 Html代码块 <div id"fullpage" class"fullpage-index"><!-- index01 --><div class"indexitem index01 section" id"#page1"><img src"img/img01.jpg"/></div>…

设计模式——工厂方法模式(Factory Method Pattern)

简单工厂模式 概述 说工厂方法模式之前&#xff0c;先说下简单工厂模式&#xff0c;简单工厂模式并不属于GoF 23个经典设计模式&#xff0c;但通常将它作为学习其他工厂模式的基础&#xff0c;它的设计思想很简单&#xff0c;其基本流程如下&#xff1a;首先将需要创建的各种不…

NODE笔记 0

一些简单的node学习笔记记录&#xff0c;是Vue等前端框架的基础 入门学习备忘录 文章目录 前言一、pandas是什么&#xff1f;二、使用步骤 1.引入库2.读入数据总结 前言 node.js 内置网络服务器&#xff0c;是前端框架学习的基础&#xff1a; 概念&#xff1a;…

大模型机器人发展史:从VoxPoser、RT2到斯坦福Mobile ALOHA、Google机器人

前言 23年7月&#xff0c;我在朋友圈评估Google的RT2说道&#xff1a; “大模型正在革新一切领域啊&#xff0c;超帅&#xff0c;通过大模型不仅能理解“人话”&#xff0c;还能对“人话”进行推理&#xff0c;并转变为机器人能理解的指令&#xff0c;从而分阶段完成任务。回…

Web前端-jQuery

文章目录 jQuery1.1 jQuery 介绍1.1.1 JavaScript 库1.1.2 jQuery的概念1.1.3 jQuery的优点 1.2 jQuery 的基本使用1.2.1 jQuery 的下载1.2.2 jQuery快速入门1.2.3 jQuery入口函数1.2.4 jQuery中的顶级对象$1.2.5 jQuery 对象和 DOM 对象1.2.6. jQuery 对象和 DOM 对象转换 1.3…

二叉树OJ练习(二)

1. 二叉树的最近公共祖先 题目描述&#xff1a; ​ 题解: 1.p或者q其中一个等于root&#xff0c;那么root就是最进公共祖先 2.p和q分布在root的左右两侧&#xff0c;那么root就是最进公共祖先 3.p和q在root的同一侧&#xff0c;就是要遍历这棵树&#xff0c;遇到p或者q返回 ​…

数据结构—图(下)

文章目录 12.图(下)(4).生成树和最小生成树#1.什么是生成树和最小生成树&#xff1f;i.生成树ii.最小生成树 #2.Prim算法i.算法思想ii.看看例子iii.代码实现 #3.Kruskal算法i.算法思想ii.看看例子iii.代码实现 #4.次小生成树 (5).最短路径问题#1.加权有向图的最短路径问题#2.单…

(Matlab)基于CNN-Bi_LSTM的多维时序回归预测(卷积神经网络-双向长短期记忆网络)

目录 一、程序及算法内容介绍&#xff1a; 基本内容&#xff1a; 亮点与优势&#xff1a; 二、实际运行效果&#xff1a; 三、部分代码展示&#xff1a; 四、完整代码数据下载&#xff1a; 一、程序及算法内容介绍&#xff1a; 基本内容&#xff1a; 本代码基于Matlab平…

鹦鹉目标检测数据集VOC格式600张

鹦鹉&#xff0c;一种色彩鲜艳、聪明伶俐的鸟类&#xff0c;以其模仿人类语言的能力和独特的喙形而广受喜爱。 鹦鹉属于鸟纲、鹦鹉科&#xff0c;是热带和亚热带地区的常见鸟类。它们的喙弯曲呈钩状&#xff0c;非常适合啄食种子、果实和坚果等食物。鹦鹉的羽毛通常非常鲜艳&a…

精进单元测试技能——Pytest断言的艺术

本篇文章主要是阐述Pytest在断言方面的应用。让大家能够了解和掌握Pytest针对断言设计了多种功能以适应在不同测试场景上使用。 了解断言的基础 在Pytest中&#xff0c;断言是通过 assert 语句来实现的。简单的断言通常用于验证预期值和实际值是否相等&#xff0c;例如&#xf…

腾讯云域名外部入库流程

注册商是腾讯云&#xff0c;且在腾讯云管理的&#xff0c;请使用此教程外部入库。 如您的域名注册商是腾讯云但在聚名管理&#xff0c;请参考教程&#xff1a;https://www.west.cn/faq/list.asp?unid2539 在外部入库操作之前&#xff0c;请先登录腾讯云获取账号ID信息。…

人类认知中的等价机理与机器智能中等价机理

人类认知中的等价机理是指人们在认知过程中&#xff0c;通过将不同的概念、事物或情境进行等价替代&#xff0c;从而实现思维的连贯和理解的补充。例如&#xff0c;当人们看到一个陌生的动物时&#xff0c;可以将它与已知的动物进行等价对应&#xff0c;从而理解其特征和行为。…

社交心不死:支付宝内测兴趣社交

关注卢松松&#xff0c;会经常给你分享一些我的经验和观点。 支付宝又双叒做社交了&#xff0c;这次的“兴趣社区”能成吗&#xff1f; 支付宝做社交心不死&#xff0c;近期支付宝又开始内测名为“兴趣社区”的功能。主打找同频玩伴&#xff0c;徒步、骑行、钓鱼&#xff0c…

将本地文件传到远程仓库

工具&#xff1a;gitee、visual studio 2022 语言&#xff1a;C语言 1、在创建项目的时候&#xff0c;将项目存储于自己创建的仓库的本地存储位置&#xff0c;并编写代码 2、先选择仓库&#xff0c;然后单击鼠标右键——>TortoiseGit——>Add..&#xff08;将代码添加到…

Spring 见解 6 Spring事务控制

Spring事务控制 事务介绍 什么是事务&#xff1f; 当你需要一次执行多条SQL语句时&#xff0c;可以使用事务。通俗一点说&#xff0c;如果这几条SQL语句全部执行成功&#xff0c;则才对数据库进行一次更新&#xff0c;如果有一条SQL语句执行失败&#xff0c;则这几条SQL语句…