五、Yocto集成QT5(基于Raspberrypi 4B)

Yocto集成QT5

本篇文章为基于raspberrypi 4B单板的yocto实战系列的第五篇文章:
一、yocto 编译raspberrypi 4B并启动
二、yocto 集成ros2(基于raspberrypi 4B)
三、Yocto创建自定义的layer和image
四、Yocto创建静态IP和VLAN

本章节实操代码请查看github仓库: meta-rpi-robot

一. 源码下载和编译

这一部分其实在第二节yocto集成ROS2中有涉及,但是为了连贯性和完整性本小节依然添加对应的描述,以方便只需要在yocto中集成QT的同学参考。

1.1 下载meta-qt5

进入到poky-kirkstone文件夹下执行如下指令下载meta-qt5源码:

git clone -b kirkstone https://github.com/meta-qt5/meta-qt5.git  meta-qt5

如图所示:
在这里插入图片描述

1.2 加入构建

修改rpi-build/conf/bblayers.conf,将meta-qt5 layer添加到构建系统中
在这里插入图片描述

二. Yocto集成

下面我们还需要将QT相关的组件打包到iamge里面去,在我们的rpi-robot-image.bb文件中添加如下内容:
在这里插入图片描述
这里只是简单添加了几个组件,如果你的QT程序很复杂依赖库较多需要都添加进来。

依赖库有了,然后还需要对需要的QT组件进行一些配置:
这里我们需要配置插件打开eglfs,打开opengl:
在recipes-qt/qt5/下面新建一个qtbase_%.bbappend文件,里面内容如下:

# Disable desktop OpenGL. Enable OpenGL ES and EGFLS.
PACKAGECONFIG_GL = "gles2 eglfs"# Enable fontconfig to get system freetype fonts
PACKAGECONFIG_FONTS += "fontconfig"PACKAGECONFIG:append = " eglfs examples accessibility "

然后在rpi-robot-image.bb文件中添加如下配置,移除x11 的feature:

DISTRO_FEATURES:append = " opengl"
DISTRO_FEATURES:remove = " x11"

这样在执行如下编译指令编译出来的image里面就有了QT的依赖库和运行环境了

bitbake rpi-robot-image

三. QT5 运行环境配置

上面是一些常规流程,打包出来的image启动以后确实有了QT环境,但是不代表QT程序就可以运行,这里需要配置很多的QT环境才能保证QT程序能够正常,这里踩了不少坑,这部分网上的资料也比较少,着重介绍下这部分的适配过程。
主要官方介绍:
https://doc.qt.io/qt-5/embedded-linux.html
https://doc.qt.io/Boot2Qt-5.15/qtee-meta-qt5.html
显示架构介绍参考:
https://wiki.t-firefly.com/zh_CN/Firefly-Linux-Guide/graphics.html
https://doc.embedfire.com/linux/rk356x/Qt/zh/latest/lubancat_qt/qtdemo/demo_run.html

在嵌入式Linux系统上,可以使用多个平台插件:EGLFS,LinuxFB或Wayland。但是,这些插件的可用性取决于Qt的配置方式。

  • LinuxFB
    插件通过linux的FBDEV(Framebuffer Device)驱动显示,不支持硬件渲染,显示性能可能会不好。
  • Wayland
    一种显示服务协议,不依赖客户端-服务器体系结构,旨在提供一个现代、 安全的的Linux和其他类Unix操作系统窗口系统取代X Window system,而Weston是Wayland开源显⽰协议的参考实现。
  • EGLFS
    是 Qt 自己实现的一个 GUI 系统,不支持多窗口,eglfs使用opengles/egl进行gpu渲染后,直接送给drm去显示。
    EGLFS is the recommended plugin for modern Embedded Linux devices that include a GPU.

本小节主要介绍EGLFS显示系统来显示QT 的应用程序。
EGLFS 需要使用的环境变量有如下内容:

# 指定显示平台插件,通过QT_QPA_PLATFORM 或者-platform命令行选项指定其他设置
export QT_QPA_PLATFORM=eglfs# 此环境变量强制执行特定的插件,QT_QPA_EGLFS_INTEGRATION 设置为eglfs_kms将使用KMS / DRM后端
export QT_QPA_EGLFS_INTEGRATION=eglfs_kms# KMS / DRM后端还通过JSON文件支持自定义配置,QT_QPA_EGLFS_KMS_CONFIG 指定配置文件的路径
# export QT_QPA_EGLFS_KMS_CONFIG=/usr/local/qt-app/conf/cursor.json# 指定将current选择一种分辨率与当前模式匹配的模式,QT_QPA_EGLFS_ALWAYS_SET_MODE
#export QT_QPA_EGLFS_ALWAYS_SET_MODE=1
# 默认情况下,KMS后端将使用旧版API,可以启用DRM atomic API,通过将QT_QPA_EGLFS_KMS_ATOMIC环境变量设置为1。
#export QT_QPA_EGLFS_KMS_ATOMIC=1
# 鼠标设备,
# QT_QPA_EVDEV_MOUSE_PARAMETERS
#export QT_QPA_EVDEV_MOUSE_PARAMETERS=abs
#export QT_QPA_EVDEV_MOUSE_PARAMETERS=/dev/input/event2
# hide/show cursor
#export QT_QPA_EGLFS_HIDECURSOR=1
# 键盘设备
# 触摸设备
# eglfs 启用tslib支持,QT_QPA_EGLFS_TSLIB
#export QT_QPA_EGLFS_TSLIB=1
# 字体库
#export QT_QPA_FONTDIR=/usr/share/fonts
# 界面旋转角度 0,90,180,270,(使用触摸屏幕,触摸也要旋转)
#export QT_QPA_EGLFS_ROTATION=-90

四. QT Demo验证

本章节实操代码请查看github仓库: meta-rpi-robot meta-rpi-robot/recipes-apps/sample
上面运行环境准备号以后就可以跑一个QT测试程序验证下我们的功能是否正常,这里我们创建一个简单的QT qml程序,只显示一张照片.
我们在meta-rpi-robot文件夹下面创建一个子文件夹:

mkdir -p  /recipes-apps/sample

里面结构如下:
在这里插入图片描述
主要看一下luncher_0.1.bb文件:

SUMMARY = "Simple Qt application with QML"
DESCRIPTION = "A basic Qt application that uses QML for the UI"
LICENSE = "MIT"
LIC_FILES_CHKSUM = "file://${COMMON_LICENSE_DIR}/MIT;md5=0835ade698e0bcf8506ecda2f7b4f302"FILESEXTRAPATHS:prepend := "${THISDIR}/:"DEPENDS = "qtbase qtquickcontrols2"SRC_DIR = "luncher"
SRC_URI = "file://luncher/"S = "${WORKDIR}/luncher"inherit  qmake5do_install() {install -d ${D}${bindir}install -m 0755 ${B}/qml_luncher    ${D}${bindir}
}FILES_${PN} = "${bindir}/*"

然后将luncher 添加到image的bb文件里面:
在这里插入图片描述
构建rpi-image

bitbake rpi-robot-image

SD卡刷机启动以后先设置以下环境变量然后执行qml_luncher app程序:

export QT_QPA_PLATFORM=eglfs
export QT_QPA_EGLFS_NO_LIBINPUT=1
qml_luncher

效果如下:
在这里插入图片描述
完整代码请查看github仓库: meta-rpi-robot

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

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

相关文章

数据可视化-Python

师从黑马程序员 Json的应用 Json的概念 Json的作用 Json格式数据转化 Python数据和Json数据的相互转化 注:把字典列表变为字符串用dumps,把字符串还原回字典或列表用loads import json#准备列表,列表内每一个元素都是字典,将其转化为Json …

python实战之常用内置模块

一. 数学计算模块(math) 二. 日期时间模块(datetime) 1. datetime类 datetime类的常用方法 2. date类 1. date类的常用方法 3. time类 4. 计算时间跨度类(timedelta) 5. 日期时间与字符串相互转换 1. 日期和时间格式控制符 三. 正则表达式模块(re) 正则表达式指预先定义好一个’…

CCF-CSP26<2022-06>-第1/2/3题

202206-1 归一化处理 题目&#xff1a;202206-1 题目分析&#xff1a; 给出了数学上归一化的数学公式&#xff0c;直接按照要求完成即可。 AC代码&#xff1a; #include <bits/stdc.h> using namespace std; int main() {int n;cin >> n;double a[n];double s…

吴恩达:现在做GPT-4智能体,或将提前达到GPT-5效果|钛媒体AGI

斯坦福大学客座教授吴恩达&#xff08;Andrew Ng&#xff09;© 林志佳 美国斯坦福大学教授吴恩达&#xff08;Andrew Ng&#xff09; 人工智能智能体&#xff08;AI Agents&#xff09;似乎将引领 AI 行业新的发展趋势。 近日红杉资本&#xff08;Sequoia&#xff09;在…

微信小程序(黑马优购:商品列表)

1.渲染商品列表并美化布局 <view class"goods-list"><block v-for"(goods,i) in goodsList" :key"i"><view class"goods-item"><!-- 左侧的盒子 --><view class"goods-item-left"><image …

全面概述Gitee和GitHub生成/添加SSH公钥

前言 现如今将代码开源已经成为软件开发行业的一种趋势&#xff0c;而现在比较有名的代码托管平台有GItHub、Gitee、Gitlab等相关平台。而我们在使用代码托管平台最为常见的就是如何将自己本地的代码推送到远程托管平台中的仓库中&#xff0c;现如今各大托管平台基本上都提供了…

Mac m1 Flink的HelloWorld

首先在官方下载Downloads | Apache Flink 下载好压缩包后解压&#xff0c;得到Flink文件夹 进入&#xff1a;cd flink-1.19.0 ls 查看里面的文件&#xff1a; 执行启动集群 ./bin/start-cluster.sh 输出显示它已经成功地启动了集群&#xff0c;并且正在启动 standalonesessio…

简单了解HTTP和HTTPS

HTTP的安全问题&#xff1f; 我们都知道HTTP是不安全的&#xff0c;而HTTPS是安全的&#xff0c;那HTTP有哪些安全问题呢&#xff1f;&#xff08;考虑传输过程以及响应方&#xff09; 明文传输&#xff0c;有窃听风险&#xff1a;HTTP协议无法加密数据&#xff0c;所有通信数…

云计算探索-剖析虚拟化技术

引言 虚拟化技术&#xff0c;作为现代信息技术架构的核心构成元素&#xff0c;以其独特的资源抽象与模拟机制&#xff0c;成功地瓦解了物理硬件与操作系统间的刚性连接&#xff0c;开创了一个资源共享、灵活调配的崭新天地。本文将详细解析虚拟化技术的内涵、发展历程、分类及特…

JavaScript的概念

什么是 JavaScript JavaScript 一种直译式脚本语言&#xff0c;是一种动态类型、弱类型、基于原型的高级语言。 脚本语言&#xff1a;在程序的运行过程中逐行进行解释执行&#xff0c;不需要预编译。 动态类型&#xff1a;在声明了一个变量之后&#xff0c;我们能够随时改变…

Kafka 学习之:基于 flask 框架通过具体案例详解生产消费者模型,这一篇文章就够了

文章目录 案例信息介绍后端异步处理请求和后端同步处理请求同步方式异步方式 环境文件目录配置.envrequirements.txt 完整代码ext.pyapp.pykafka_create_user.py 运行方式本地安装 kafka运行 app.py使用 postman 测试建立 http 长连接&#xff0c;等待后端处理结果发送 RAW DAT…

金三银四面试题(九):JVM常见面试题(3)

今天我们继续探讨常见的JVM面试题。这些问题不比之前的问题庞大&#xff0c;多用于面试中JVM部分的热身运动&#xff0c;开胃菜&#xff0c;但是大家已经要认真准备。 你能保证GC 执行吗&#xff1f; 不能&#xff0c;虽然你可以调用System.gc() 或者Runtime.gc()&#xff0c…

【MySQL】DQL-排序查询-语法&排序方式&注意事项&可cv例题语句

前言 大家好吖&#xff0c;欢迎来到 YY 滴MySQL系列 &#xff0c;热烈欢迎&#xff01; 本章主要内容面向接触过C Linux的老铁 主要内容含&#xff1a; 欢迎订阅 YY滴C专栏&#xff01;更多干货持续更新&#xff01;以下是传送门&#xff01; YY的《C》专栏YY的《C11》专栏YY的…

外观模式详解:简化复杂系统的“门面”担当

在软件开发中&#xff0c;我们经常遇到需要将复杂的子系统整合到一起&#xff0c;为客户端提供一个统一且简化的接口的情况。这时候&#xff0c;外观模式&#xff08;Facade Pattern&#xff09;便应运而生。本文将深入探讨外观模式的应用场景、Java代码实现、在开源项目中的实…

【Linux】寿司线程池{单例模式之懒汉模式下的线程池}

文章目录 回顾单例模式0.多线程下的单例模式的意义1.什么是单例模式1.0设计模式1.1C单例模式的介绍及原理1.2拷贝构造和赋值重载的处理1.3if (nullptr ptr)&#xff0c;nullptr放在比较运算符的前面?1.4实现单例模式的方式 2.实现懒汉方式的单例模式2.1单线程的单例模式2.2多…

微信小程序(黑马优购:登录)

1.点击结算进行条件判断 user.js //数据 state: () >({ // address: {} address: JSON.parse(uni.getStorageSync(address) || {}), token: }), my-settle.vue computed: { ...mapGetters(m_cart,[checkedCount,total,checkedGoodsAmount]), …

前端工程师————CSS学习

选择器分类 选择器分为基础选择器和复合选择器 基础选择器包括&#xff1a;标签选择器&#xff0c;类选择器&#xff0c;id选择器&#xff0c;通配符选择器标签选择器 类选择器 语法&#xff1a;.类名{属性1&#xff1a; 属性值&#xff1b;} 类名可以随便起 多类名使用方式&am…

从乡间小路到布鲁金斯大道:奥林商学院院长的公路之旅

复旦大学-华盛顿大学EMBA项目&#xff0c;是由复旦大学管理学院与美国华盛顿大学奥林商学院联合开办的EMBA项目。美国华盛顿大学奥林商学院&#xff0c;于去年9月迎来新院长Mike。      今年1月&#xff0c;Mazzeo院长首次到访复旦大学&#xff0c;与校友分享了一场 “经济…

中间件安全(apache、tomcat)

靶场&#xff1a; vulfocus Apache Apache HTTP Server 是美国阿帕奇&#xff08; Apache &#xff09;基金会的一款开源网页服务器。该服务器具有快速、可靠且可通过简单的API进行扩充的特点&#xff0c;发现 Apache HTTP Server 2.4.50 中针对 CVE - 2021 - 41773 的修复…

PHP三种方式读取RSA密钥加解密、签名验签完整教程

目录 第一步、生成公私钥 第二步、三种方式读取RSA密钥 第1种&#xff1a;公私钥弄成一行&#xff0c;必须一行没有空格和换行 第2种&#xff1a;直接复制生成公私钥 第3种;复制密钥存储为.pem文件后缀 第三步、RSA加解密 第四步、RSA签名以及验证签名 第五步、封装完整…