嵌入式Linux Qt开发:1、搭建基于ubuntu18.04的Qt开发环境及测试(解决Qt creator输入法问题)
一、前言
基本在我职业生涯开始时就已经在使用Qt进行一些上位机开发了,后续也有一些嵌入式设备用Qt开发,但是一直没有完整和系列的总结,包括C++也是,这里慢慢补上一些总结,防止很多经验总结和学习过程又遗忘了,到用的时候又需要重新来一遍。
目前大多数时候我都使用C/C++/shell开发,也使用过python、lua、go、java等开发过一些软件,但是我还是对人机界面开发这种所见即所得的开发更加感兴趣,这种所见即所得的开发更能让人产生成就感,当然,这个仅仅是个人兴趣,对于产品来说,带有显示屏的嵌入式设备能提供更多更好的人机交互体验,目前车机设备、智能家居设备、工控设备等越来越多的设备都在增加显示屏。一些小的设备可以使用lvgl+mcu,稍微复杂大型一些的设备则可能使用Qt+mpu,还有一些直接使用Android设备的(Android设备一个比较大的问题是使用时间长一点之后和Android手机一样会出现比较严重的卡顿,后续要看看鸿蒙等是否在这一点上有改善,因为设备安装更换都是比较麻烦的,像我的便宜Android手机用一两年可能就卡的厉害,互联网产品开发维护和硬件产品开发维护有时候还是有比较大的区别的),扯远了,目前我同步总结lvgl、qt、Linux、mcu、freertos、音视频、网络等的一些内容便于项目上使用,lvgl的已经基本上结束了,后续可能还有一些esp32、stm32移植开发lvgl的总结,这里继续发嵌入式Qt开发的一些内容,其余的也都慢慢会发出来。
这里没有选择lvgl而是Qt是因为评估芯片的flash、内存资源足够运行Qt,项目开发周期也相对比较紧张,lvgl目前还不是很熟悉,C的一些数据结构在实现部分位置的功能时有点复杂,所以最后综合下来也是暂时使用了Qt进行开发,在ssd202的芯片上运行,带一块7寸的显示屏,有id卡读取、播放音乐、Wi-Fi链接、有线连接等,理论上也可以播放1080P的视频,只是目前暂时没有用到,目前产品生产阶段来做一些总结和回顾,便于后续更好的进行嵌入式Linux下的Qt开发。
二、搭建ubuntu18.04开发环境
为什么要在ubuntu上搭建Qt开发环境
之前我的一些文章基本上都是在windows上搭建开发环境,基本上都是开发一些上位机或者测试工具软件,但是我这里主要是针对嵌入式Linux设备上使用Qt,不选择windows而是在ubuntu18.04上搭建Qt开发环境,一方面是方便后续配置使用arm Linux的交叉编译环境直接可以交叉编译Qt项目生成嵌入式设备上的程序,另一方面是由于部分可用于检测Qt程序内存泄漏和CPU异常的工具在macoS和Windows上可能是没有的或者无法使用的,比如Valgrind。
1、准备基础环境
- ubuntu18.04
这里可以直接使用虚拟机搭建ubuntu18.04也可以直接真机安装ubuntu,由于目前大部分电脑系统都是Windows,因此建议使用虚拟机搭建ubuntu18.04,但是如果学习的时候总是忍不住想要玩Windows游戏,则建议直接真机安装ubuntu,这样来回切换系统麻烦一些也能减少玩游戏,等到专注到学习后你会发现学习到知识的成就感有时候并不比游戏带来的成就感少。
关于虚拟机安装Windows、ubuntu这些不再多说,需要的可以参考我之前的一些文章,包括Windows和macOS等系统通过虚拟机安装windows、ubuntu/centOS:
https://blog.csdn.net/weixin_39510813/article/details/75145572
https://blog.csdn.net/weixin_39510813/article/details/88562842
https://juejin.cn/post/7123365591418667016
https://juejin.cn/post/7123164977535385613
之前基本上都是用ubuntu16。04,目前由于各类软件和库的更新,基本上用ubuntu18.04比较多了,相比于以前的一些配置也有一些变化,这一点需要注意一下。
- QT5.9/QT5.12
Qt5.9及之前的版本可以直接跳过登陆:https://download.qt.io/new_archive/qt/5.9/
Qt5.12有一键离线安装包,登陆时可以断网跳过。
后续的一些Qt版本比如5.15这些可能没有一键安装包,而且使用起来可能还是有一些比较明显的bug,所以目前我这里建议如果没有使用到一些高版本的特性功能的话直接用这两个版本学习就足够了,可能后续都需要切换到Qt6了,就像我当时接触的时候很多还是Qt4,但是目前慢慢都是Qt5,很可能随着发展基本都用Qt6了,所以学习时不必太纠结于版本,系统了解学习一下Qt开发,后续的一些其它UI开发也可以使用类似的套路去学习,就能快速掌握了。
之前的5.9.1安装有过一些总结,可以参考一下:https://juejin.cn/post/7117815582892195854
这里再针对5.12在ubuntu18.04上安装配置做一下总结。
更换ubuntu18.04的源
1、备份原来的源
sudo cp /etc/apt/sources.list /etc/apt/sources_init.list
2、使用 vim 编辑源
sudo vim /etc/apt/sources.list
3、更换为阿里的源(Ubuntu18.04)
deb http://mirrors.aliyun.com/ubuntu/ bionic main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ bionic main restricted universe multiversedeb http://mirrors.aliyun.com/ubuntu/ bionic-security main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ bionic-security main restricted universe multiversedeb http://mirrors.aliyun.com/ubuntu/ bionic-updates main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ bionic-updates main restricted universe multiversedeb http://mirrors.aliyun.com/ubuntu/ bionic-proposed main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ bionic-proposed main restricted universe multiversedeb http://mirrors.aliyun.com/ubuntu/ bionic-backports main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ bionic-backports main restricted universe multiverse
4、更新源
sudo apt-get update
2、ubuntu18.04下安装Qt5.12
2.1、下载安装Qt5.12
目前5.12.12的下载地址:https://download.qt.io/archive/qt/5.12/5.12.12/
ubuntu下我们下载https://download.qt.io/archive/qt/5.12/5.12.12/qt-opensource-linux-x64-5.12.12.run即可。
chmod +x qt-opensource-linux-x64-5.12.12.run
./qt-opensource-linux-x64-5.12.12.run
之后会跳出安装界面,按照提示一步步向下。
这可以选择安装位置:
这里由于我们是学习所以将desktop桌面版本、Android arm64-v8a、源码source、其它的一些组件Qt Charts等都选上了,避免后面学习用到还需要重新安装:(如果你开发过程中用不到可以不用选,特别source这里占空间比较大,用不到看源码的话完全可以不用选,组件这里也是一样,很多组件实际开发的时候可能都用不到,同样Android arm64-v8a这里如果不会使用到android设备上也是不需要的)
之后一路下一步直到安装完成即可。
2.2、运行时可能的错误并启动qtcreator
可能的错误:
qt.qpa.plugin: Could not load the Qt platform plugin "xcb" in "" even though it was found.
This application failed to start because no Qt platform plugin could be initialized. Reinstalling the application may fix this problem.Available platform plugins are: eglfs, linuxfb, minimal, minimalegl, offscreen, vnc, xcb.
解决方法:
sudo apt-get install libxcb1 libxcb1-dev
sudo apt-get install libx11-xcb1 libx11-xcb-dev
sudo apt-get install libxcb-xinerama0 libxcb-xinerama0-dev
然后在Qt的安装目录下找到qtcreator并运行:
或者在应用中找到qt creator运行:
2.3、创建运行示例程序
创建Widget application:
创建helloworld项目:
目前先选择qmake,可以看到也可以选择cmake和Qbs:
这里先创建mainwindow,也可以简单创建widget或者dialog:
这里语言选择中文,之前的很多版本是没有的:
这里选择desktop的,Android的需要配置一些jdk,之前有一篇文章介绍了,这里暂时不展开了,我们暂时开发桌面版本做测试:
选择git作为版本控制:
如果创建项目后无法编译,而且文件main.cpp很多报错,则需要点击项目进行项目配置:
配置发现桌面版本的kit配置不正常:
发现没有c++的编译器:
我们看到Qt自带了clang c编译器(具体可以看到是clang12),但是没有clang-c++编译器(高版本基本都不再使用gcc/g++了),我们安装后手动配置一下:
sudo apt-get install clang+
之后可以在编译栏自动搜索一下即可,目前基本都用clang了(搜索到后点击apply):
之后在kits栏选择c++的编译器:
之后DeskTop就可以选择了,选择后点击配置项目即可:
配置成功后就如下,接下来可以正常编译项目并运行了:
点击左侧的绿色三角▶️箭头直接编译运行即可,如果还是报错看下是否没有make导致的:
没有make则安装make即可:
sudo apt-get install make
如果编译时报错👎 error: cannot find -lGL(虽然你现在可能没有用到OpenGL还是会报该错误):
sudo apt-get install libgl1-mesa-dev
安装相关库和程序后重启一下qtcreator即可识别到了。
没有错误则可以正常运行起来:
我们加一下helloworld的label显示:
3、安装输入法及解决Qt使用中文的问题
接下来我们需要在ubuntu上安装中文输入法以及Qt creator无法使用中文输入法输入中文的问题,安装中文输入法比较简单:
3.1、安装中文在 Ubuntu 18.04 上安装中文输入法通常可以通过以下步骤完成:
1. 更新软件源
打开终端,首先确保系统软件源是最新的:
sudo apt update
2. 安装 fcitx
输入法框架
在 Ubuntu 上,fcitx
是常用的中文输入法框架之一。你可以使用以下命令来安装它及其中文输入法支持包(例如 fcitx-pinyin
或 fcitx-sunpinyin
):
sudo apt install fcitx fcitx-pinyin fcitx-googlepinyin
3. 安装中文语言支持
通过以下命令安装中文语言支持:
sudo apt install language-pack-zh-hans
4. 设置 fcitx
为默认输入法框架
你可以通过图形界面进行设置,或者在终端中手动配置。
图形界面配置:
- 打开“设置”应用。
- 进入“区域与语言”选项。
- 在“管理已安装的语言”中,将语言切换到中文(简体)并应用。
- 重启系统或注销重新登录。
手动配置:
使用以下命令打开配置文件:
sudo vim /etc/environment
将以下内容添加到文件末尾:
GTK_IM_MODULE=fcitx
QT_IM_MODULE=fcitx
XMODIFIERS=@im=fcitx
保存并退出。
5. 重新启动系统
重启系统以应用设置。
6. 启动并配置 fcitx
重启后,输入法应该会自动启动。如果没有,你可以手动启动 fcitx
:
fcitx
你可以通过任务栏中的 fcitx
图标来配置输入法,包括切换输入法和调整输入法的快捷键等。
- 启动输入法
- 配置输入法
- 添加和删除一些输入法,保留英文和中文两个输入法用于切换不同输入场景
- 配置输入法切换快捷键
- mac虚拟机的话可以选择配置ctrl+shift+>(因为command和option比较特殊)全局的话就是针对全局切换的,局部的话就针对这一个局部的窗口或操作,还会切回来
- 结果
3.2、Qt creator配置使用中文输入法
虽然中文输入法有了,vim等都可以操作了,但是你会发现Qt creator打开后还是无法使用中文输入法。
- 1. 确保
/opt/Qt5.12.2/5.12.2/gcc_64/plugins/platforminputcontexts/
与
/opt/Qt5.12.2/Tools/QtCreator/lib/Qt/plugins/platforminputcontexts/
目录下存在libfcitxplatforminputcontextplugin.so文件,并且有可执行权限;
- 2. 如果没有该文件的话,请执行 sudo apt-get install fcitx-frontend-qt5 安装,并从 /usr/lib/x86_64-linux-gnu/qt5/plugins/platforminputcontexts/libfcitxplatforminputcontextplugin.so 拷贝到上述两个目录,赋予执行权限;
sudo cp libfcitxplatforminputcontextplugin.so /opt/Qt5.12.2/Tools/QtCreator/lib/Qt/plugins/platforminputcontexts/
sudo cp libfcitxplatforminputcontextplugin.so /opt/Qt5.12.2/5.12.2/gcc_64/plugins/platforminputcontexts/
- 3.如果执行完上述操作后,重启Qtcreator依然无法输入中文,请执行 sudo gedit /etc/profile ,在打开的文件尾部添加以下内容:
export XIM_PROGRAM=fcitx
export XIM=fcitx
export GTK_IM_MODULE=fcitx
export QT_IM_MODULE=fcitx
export XMODIFIERS="@im=fcitx"
然后注销,重启或者source /etc/profile就可以了。
如果root权限启动不正常可以试一下普通用户是否可以正常使用。
三、最后
接下来我们说一下Qt Designer使用和信号槽机制,再总结一下各个控件的样式和使用以及布局,封装一些常用的文件、网络等应用接口调用,做一些硬件交互接口封装调用示例,这些基本上就算是系统性的完成了嵌入式LinuxQt的总结,之后就是一些零星的比较特殊的Qt信号槽妙用,复杂的样式绘制,由于目前主要是嵌入式Linux下用,这里的总结不会涉及到opencv、opengl等比较复杂庞大的库的调用,也会说一下一般嵌入式Linux下Qt开发需要的flash和内存的一些要求,嵌入式设备下的滑动屏效果实现,一些小控件的自定义便于在小显示屏上显示的技巧等,更多的嵌入式、Linux的内容还需要一些其它系统总结来呈现。
相关文章:

嵌入式Linux Qt开发:1、搭建基于ubuntu18.04的Qt开发环境及测试(解决Qt creator输入法问题)
一、前言 基本在我职业生涯开始时就已经在使用Qt进行一些上位机开发了,后续也有一些嵌入式设备用Qt开发,但是一直没有完整和系列的总结,包括C也是,这里慢慢补上一些总结,防止很多经验总结和学习过程又遗忘了ÿ…...

element-ui的el-cascader增加全选按钮实现(附源码)
最近遇到了在级联选择器上添加全选框的需求 ,但是项目使用的是Vue2 Element UI的架构,而我们都知道Element UI提供的级联选择器el-cascader是不支持全选框的,而我又没有在网上找到适合我项目的实现,索性自己实现一个组件…...

Scratch游戏 | 企鹅大乱斗
有没有过无聊到抓狂的时刻?试试这款 企鹅大乱斗 吧!超简单的玩法,让你瞬间告别无聊! 🎮 玩法超简单 等待屏幕出现 ”Go!” 疯狂点击,疯狂拍打企鹅! 💥 游戏特色 解压神器&#x…...
游戏行业DDoS攻击类型及防御分析
游戏行业作为DDoS攻击的高发领域,攻击类型复杂多样,结合多个来源的信息,以下是其主要攻击类型及特征分析: 1. 传统流量型DDoS攻击 UDP洪水攻击:通过大量UDP报文淹没服务器端口,消耗带宽资源,导…...

Uniapp中小程序调用腾讯地图(获取定位地址)
1、先配置权限: 这是上图的代码: "permission": { "scope.userLocation": { "desc": "你的位置信息将用于小程序位置接口的效果展示" } } 第二步:写代码: //下面是uniapp的模版代码 主…...

2025全网首发:ComfyUI整合GPT-Image-1完全指南 - 8步实现AI图像创作革命
ComfyUI整合GPT-Image-1完全指南:8步实现AI图像创作革命【2025最新】 OpenAI最新发布的GPT-Image-1模型(也就是ChatGPT-4o背后的图像生成技术)已经通过API开放使用,而令人惊喜的是,ComfyUI已经第一时间提供了完整支持&…...
利用SAP aATP产品分段策略应对订单关税挑战
本文探讨了如何通过在SAP S/4HANA系统中结合**产品分段(Product Segmentation)与高级可承诺性(aATP)**功能,帮助企业在全球化贸易中更有效地处理关税问题,并提升订单承诺的精准性。 产品分段与原产国&…...

工业4.0神经嫁接术:ethernet ip转profinet协议通信步骤图解
在现代工业自动化领域,不同品牌的设备和协议之间的兼容性问题一直是个挑战。我们的包装线项目就遇到了这样的难题:需要将Rockwell Allen-Bradley的EtherNet/IP伺服系统与西门子PLC的PROFINET主站进行无缝对接。为了解决这一问题,我们采用了et…...
深入理解反序列化攻击:原理、示例与利用工具实战
反序列化漏洞是现代 Web 安全中的一个高危攻击类型,常常导致远程代码执行(RCE)、文件读写、身份伪造等严重后果。本文将从基础原理讲起,结合实际代码和工具(PHPGGC、ysoserial)演示反序列化攻击的完整过程。…...
Qt原型模式实现与应用
在Qt中实现原型模式(Prototype Pattern)可以通过以下步骤完成。该模式的核心是通过克隆现有对象来创建新对象,而非通过传统的构造函数。以下是详细说明和示例: 1. 原型模式的核心概念 目的:避免重复初始化对象的高成本…...
Java详解LeetCode 热题 100(17):LeetCode 41. 缺失的第一个正数(First Missing Positive)详解
文章目录 1. 题目描述2. 理解题目3. 解法一:排序法(不满足题目要求)3.1 思路3.2 Java代码实现3.3 代码详解3.4 复杂度分析3.5 不足之处 4. 解法二:哈希表法4.1 思路4.2 Java代码实现4.3 代码详解4.4 复杂度分析4.5 不足之处 5. 解…...
[Java实战]Spring Boot + Netty 实现 TCP 长连接客户端及 RESTful 请求转发(二十六)
[Java实战]Spring Boot Netty 实现 TCP 长连接客户端及 RESTful 请求转发(二十六) 在现代微服务架构中,经常需要在不同服务之间进行高效、可靠的通信。本文将介绍如何使用 Spring Boot 结合 Netty 实现一个 TCP 长连接客户端,并…...

【Linux】动静态库的使用
📝前言: 这篇文章我们来讲讲Linux——动静态库的使用 🎬个人简介:努力学习ing 📋个人专栏:Linux 🎀CSDN主页 愚润求学 🌄其他专栏:C学习笔记,C语言入门基础&…...

Java基础(网络编程)
一、概述 目的:网络通信: 1、设备和设备 2、进程和进程 1)不同设备之间 2)本地设备之间 需要解决的问题: 如何准确地发送到对方的主机 - IP地址 - 唯一的定位网络中的一台主机 如何准确的发送到对方主机的进程 -…...

计量——异方差的检验及其修正
目录 1.异方差的检验 1 BP检验 2white检验 2.异方差的修正 1.异方差的检验 1 BP检验 选择检验方法:BP BP检验的实际步骤(非机器): 1.y对所有x进行回归,得到残差u。计算残差的平方u^2 2.u^2对所有x进行回归&#…...

学习C++的好书:C++编程之禅
历时四个月,把这本书看了一遍,受益匪浅,推荐给大家,系统的学习一遍C。...

OpenCV进阶操作:人脸检测、微笑检测
文章目录 前言一、OpenCV如何实现人脸检测1、haar特征2、级联分类器3、级联分类器的使用 二、人脸检测、微笑检测 案例实现1、预处理2、加载分类器3、标注人脸4、运行结果:4、微笑检测 总结 前言 要实现人脸识别首先要判断当前图像中是否出现了人脸,这就…...

车载诊断进阶篇 --- 车载诊断概念
我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 钝感力的“钝”,不是木讷、迟钝,而是直面困境的韧劲和耐力,是面对外界噪音的通透淡然。 生活中有两种人,一种人格外在意别人的眼光;另一种人无论…...

制作一款打飞机游戏49:敌人抖动
蛇形敌人 如果你玩过一些射击游戏(shmups),尤其是老式的射击游戏,你可能会遇到一种敌人,它们像蛇一样移动。我想在我们的游戏中实现这种效果。这种动态的感觉非常棒,我们完全有能力通过动画来实现它。 方…...
elementplus el-tree 二次封装支持配置删除后展示展开或折叠编辑复选框懒加载功能
本文介绍了基于 ElementPlus 的 el-tree 组件进行二次封装的 TreeView 组件,使用 Vue3 和 JavaScript 实现。TreeView 组件通过 props 接收树形数据、配置项等,支持懒加载、节点展开/收起、节点点击、删除、编辑等操作。组件内部通过 ref 管理树实例&…...

Pycharm IDEA加载大文件时报错:The file size exceeds configured limit
解决方案:配置一下idea.properties文件 文件里面写入代码: idea.max.intellisense.filesize50000重启IDEA即可;...
free void* 指令
https://stackoverflow.com/questions/2182103/is-it-ok-to-free-void free(ptr) 仅释放指针指向的内存,不会修改指针变量本身的值。调用后,ptr 仍然指向原来的地址(称为 "悬空指针"),但该地址对应的内存已…...

PDA手持终端应用有哪些?
随着技术进步不断拓展,PDA手持终端其便携性与多功能特性使其成为多行业数字化转型的核心工具。主要包括物流与仓储管理、零售行业、医疗行业以及制造业等。 1.物流与仓储管理 在物流与仓储管理中,PDA手持终端主要用于物品的实时跟踪、库存管理和拣货作业…...
Python模块化编程
Python模块化编程 记得我刚学Python那会儿,特别喜欢把所有代码都写在一个文件里。直到有一天,我的项目膨胀到了2000多行代码,每次修改都要翻半天…这才痛定思痛,开始研究模块化编程。今天就跟大家聊聊这个让代码变得优雅的魔法。…...
Linux性能分析工具perf
perf 工具详解 perf(Performance Counters for Linux)是 Linux 系统上的一个强大的性能分析工具,用于监控和分析系统及应用程序的性能。它基于 Linux 内核的 Performance Event Subsystem(perf_events),能…...
Android开发-使用内容组件获取通讯信息
在Android开发中,访问和处理用户的通讯信息(如联系人、通话记录等)是一项常见的需求。通过使用Android的内容提供者(ContentProvider),开发者可以方便地查询这些数据,并将其集成到自己的应用中。…...
文件目录与检索综合练习题
文章目录 前言一、基础部分二、参数应用三、参数进阶四、组合应用五、归档压缩六、统计与分析总结 前言 这部分练习题帮助大家更好的掌握命令 一、基础部分 1.用grep在error.log中查找所有含"Timeout"的行 2.使用find在/var/log下搜索7天内修改过的.log文件 3.对da…...

Python+Selenium爬虫:豆瓣登录反反爬策略解析
1. 引言 在当今互联网时代,数据抓取(爬虫)技术广泛应用于数据分析、市场调研、自动化测试等领域。然而,许多网站采用动态加载技术(如Ajax、React、Vue.js等框架)来渲染页面,传统的**<font s…...
信息系统运行管理员:临阵磨枪版
信息系统运行管理员考试 - 全覆盖详细背诵大纲 (根据考情分析和原始材料,力求完整覆盖考点细节) 第一部分:基础知识与运维概览 Chapter 1: 信息系统运维概述 (上午题 5分) 信息: 含义:香农 - 减少随机不确定性的东西;…...

电总协议调试助手更新-PowerBus-v1.0.5
电总协议调试助手,该工具主要是用于打包电总协议,用于电总协议的设备调试(精密空调、UPS、基站电源等等)。电总协议校验计算、编码转换比较麻烦,手动组包困难,使用该工具可以大大提高调试效率。 Ver1.0.5版…...