Linux上位机开发实践(关于Qt的移植)

【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing @163.com】

        linux平台上面,很多界面应用,都是基于qt开发的。不管是x86平台,还是arm平台,qt使用的地方都比较多。虽然现在很多产品开始使用lvgl,不过就目前的观察来说,qt基本上还是大家默认的界面标准。今天就来讨论下,qt本身是如何port到平台之上的。

1、安装方法

        目前要在Linux上面使用qt,主要就是两种方法。一种是直接apt-get下载;还有一种就是自己用源代码进行编译。如果是利用apt-get下载,一般代表系统本身已经安装好了ubuntu,或者是debian。这种情况下直接apt-get安装,无疑是最方便的。

        另外一种,用编译源代码的方式安装。这种方式在那些cpu性能不是特别强的soc上面,表现得特别明显。比如本身cpu就是a7、a9,频率也不算太高,大家使用qt就是做一个界面,增加一下人机交互而已,平时根本不安装ubuntu界面。这个时候,要是没有qt,就只能通过网络或者串口的方式,和嵌入式设备做交互了。

        今天主要讲的,就是后面一种移植方法。

2、qt编译前的依赖

        qt要能正确编译使用,主要依赖于三个部分。第一,linux本身的屏幕驱动是否ok;第二,触控ic的驱动是否ok;第三,tslib是否安装。有了这三部分,再加上qt自身,就可以用利用qt的lib,开发独立界面应用了。

3、屏幕驱动

        屏幕驱动是基础。不管是mipi屏幕,还是rgb屏幕,或者是hdmi这种没有屏幕的接口,只要可以显示,那么就会出现设备节点/dev/fb0。每出现这样一个节点,就代表嵌入式soc有一个屏幕。qt底层对屏幕的所有操作,也都是借助于/dev/fb0节点来完成的。所以,本质上qt就是一个中间件,和fatfs、lwip、sqlite这些中间件是一个道理。

4、触控驱动

        为了增加体验,很多的屏幕都是触摸屏。想要获得触摸数据,一般会借助于i2c总线和解析芯片,来获得触控信息。触控信号的形式,一般是x+/x-/y+/y-,经过芯片转换成i2c信号,被soc读取。另外,不是所有的屏幕都是触摸屏,只要那些带有触摸信号的屏幕,才有触屏功能,不然只是简单的传统屏幕。

        等到驱动ok了之后,我们就会看到/dev/input/event0这样的节点。

5、tslib库

        tslib是专门为触摸屏开发的一个开源软件。它的作用有两个,一个是触摸屏校准。即,通过显示几个点,以及收到的i2c信号,tuning出一组参数。这组参数,将来可以直接作用于算法,把触摸信号转换成屏幕x、y坐标。另外一个,就是防止抖动,滤波、降低噪声,为上层提供一个统一的接口。这样上层的GUI就可以专注于图形界面的绘制和解析了。

6、qt怎么部署

        qt要使用起来,需要这几个部分。第一,基于qt的应用程序;第二,qt库;第三,tslib库;第四,就是环境变量。其中前三部分都需要copy到嵌入式板子上,第四部分需要运行qt应用程序之前设置起来。一切都没有问题之后,就可以执行qt应用程序了。

7、qt下camera的实时显示

        有一些场景是需要在qt界面中同时显示camera数据的,如果soc支持mpp平台的话,建议多多使用。把qt的底层切换成vo->layer->channel下面的一个通道。这样就可以借助于vo中通道的概念,把qt覆盖在camera图像上显示,顺势借助于中间的透明label控件,就可以达到实时camera显示的目的。

        很多低端的soc,cpu非常弱,如果有类似mpp这样的加速平台,一定要多用起来。这样才可以弥补cpu不足带来的劣势,反而达到事半功倍的效果。反之,如果真的靠cpu去搬数据,一张一张来贴图,效果只会惨不忍睹。

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

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

相关文章

”插入排序“”选择排序“

文章目录 插入排序1. 直接插入排序(O(n^2))举例1:举例2:直插排序的"代码"直插排序的“时间复杂度” 2. 希尔排序(O(n^1.3))方法一方法二(时间复杂度更优) 选择排序堆排序直接选择排序 我们学过冒泡排序,堆排序等等。(回…

FPGA_BD Block Design学习(一)

PS端开发流程详细步骤 1.第一步:打开Vivado软件,创建或打开一个工程。 2.第二步:在Block Design中添加arm核心,并将其配置为IP核。 3.第三步:配置arm核心的外设信息,如DDR接口、时钟频率、UART接口等。 …

【Python] pip制作离线包

制作离线安装包是一种非常实用的方法,尤其是在网络环境受限或需要在多台机器上部署相同环境时。以下是详细的步骤,帮助您创建一个包含所有依赖项的离线安装包,并在后续环境中复用。 步骤 1:准备工具和环境 确保您有一台可以访问互…

为啥物联网用MQTT?

前言 都说物联网用MQTT,那分别使用Http和Mqtt发送“Hello”,比较一下就知道啦 HTTP HTTP请求报文由请求行、头部字段和消息体组成。一个最简单的HTTP POST请求如下: POST / HTTP/1.1 Host: example.com Content-Length: 5 Content-Type: …

操作系统 ------ 五种IO模型

阻塞IO:一个IO请求操作,准备阶段和复制阶段都会阻塞应用程序,直到操作完全完成 非阻塞IO:一个IO操作请求,先判断准备阶段是否完成,如果未完成立即返回,否则,进入复制阶段&#xff0…

service和endpoints是如何关联的?

在Kubernetes中,Service 和 Endpoints 是两个密切关联的对象,它们共同实现了服务发现和负载均衡的功能。以下是它们之间的关联和工作原理: 1. Service 的定义 Service 是一种抽象,定义了一组逻辑上相关的 Pod,以及用…

程序化广告行业(78/89):多因素交织下的行业剖析与展望

程序化广告行业(78/89):多因素交织下的行业剖析与展望 在程序化广告这片充满活力又不断变化的领域,持续学习和知识共享是我们紧跟潮流、实现突破的关键。一直以来,我都渴望能与大家一同探索这个行业的奥秘&#xff0c…

数智化重构供应商管理

当供应链韧性成为核心竞争力,你的供应商管理还在 “摸着石头过河” 吗? 在传统模式下,供应商管理高度依赖人工经验与纸质流程: 入库筛选如“大海捞针”:供应商资质审核停留在Excel表格比对,资质造假、历史…

网络互连与互联网

1.在路由表中找不到目标网络时使用默认路由,默认路由通常指本地网关的地址。 2.OSPF最主要的特征是使用分布式链路状态协议,而RIP使用的是距离向量协议。 3.OSPF使用链路状态公告LSA扩散路由信息 4.内部网关路由协议IGRP是一种动态距离矢量路由协议&a…

Raymarching Textures In Depth

本节课最主要的就是学会hlsl中使用纹理采样 float4 color Texture2DSample(Texobj, TexobjSampler, uv); return color; 课程中的代码(没有这张图我就没做) 课程代码产生深度的原因是uv偏移,黑色区域会不断向左偏移,直到找到白色…

【MQTT-协议原理】

MQTT-协议原理 ■ MQTT-协议原理■ MQTT-服务器 称为"消息代理"(Broker)■ MQTT协议中的订阅、主题、会话■ 一、订阅(Subscription)■ 二、会话(Session)■ 三、主题名(Topic Name&a…

docker容器安装的可道云挂接宿主机的硬盘目录:解决群晖 威联通 飞牛云等nas的硬盘挂接问题

基于Docker部署可道云(KodCloud)时,通过挂载宿主机其他磁盘目录可实现高效、安全的数据管理。具体而言,使用绑定挂载(Bind Mounts)将宿主机目录(如/data/disk2)映射到容器内的可道云…

go语言内存泄漏的常见形式

go语言内存泄漏 子字符串导致的内存泄漏 使用自动垃圾回收的语言进行编程时,通常我们无需担心内存泄漏的问题,因为运行时会定期回收未使用的内存。但是如果你以为这样就完事大吉了,哪里就大错特措了。 因为,虽然go中并未对字符串…

es6学习02-let命令和const命令

一、let命令 1.let块级作用域: let关键字 VS var关键字 2.for循环计数器很适合let命令 var:整个for循环中一直都是同一个i在做1,最后输出的就是10; let:每循环一次都是多一个i的赋值,最后输出是可以调出…

MySQL深分页问题

在项目中有一个数据导出的需求,原来的实现方式也比较简单,根据查询条件分页查所有的数据,然后转成csv的格式一行一行写进文件存储中。 实际上线之后,发现出现了慢查询,具体的sql如下: select * from tabl…

前端面试宝典---创建对象的配置

Object.create 对整个对象的多个属性值进行配置 创建对象 不可更改属性值 // 创建对象 不可更改属性值 let obj Object.create({}, {name: {value: lisi,writable: false,},age: {value: 20,writable: true,} })console.log(初始化obj, obj) obj.name wangwu console.log(…

数据结构:C语言版严蔚敏和解析介绍,附pdf

《数据结构:C语言版(第2版)》严蔚敏李冬梅吴伟民.pdf 《数据结构:C语言版》严蔚敏,李冬梅.pdf 《数据结构C语言第2版习题解析与实验指导》李冬梅.pdf 「《数据结构:C语言版(第2版 )》…

深入理解 v-for 指令及其使用方法

在 Vue.js 中,v-for 是用于渲染列表的核心指令,它允许你通过循环渲染数据源中的每一项。通过 v-for,你可以轻松地将数组、对象或其他可迭代的数据渲染成 HTML 元素。本文将详细介绍 v-for 的基本用法、常见的应用场景、最佳实践及性能优化&am…

VIRT, RES,SHR之间的关系

VIRT、RES 和 SHR 是进程内存使用的三个关键指标,它们之间的关系反映了进程的内存分配和使用情况。以下是它们的定义和关系: VIRT(虚拟内存):表示进程分配的虚拟内存总量,包括所有代码、数据、共享库、堆栈…

2025届蓝桥杯JavaB组个人题解(暂时不全,没题目)

2025 届蓝桥杯 Java B 组题解 第一次参加蓝桥杯,输入输出都用的BufferedReader和PrintWriter,怕输入输出不对或者内存超限,也怕出现小错误运行不了的,比如Main打成Mian什么的,但还是希望能拿省一,这里给出自…