一、前言
基本在我职业生涯开始时就已经在使用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:
之前基本上都是用ubuntu16.04,目前由于各类软件和库的更新,基本上用ubuntu18.04比较多了,相比于以前的一些配置也有一些变化,这一点需要注意一下。
- QT5.9/QT5.12
Qt5.9及之前的版本可以直接跳过登陆:download.qt.io/new_archive…
Qt5.12有一键离线安装包,登陆时可以断网跳过。
后续的一些Qt版本比如5.15这些可能没有一键安装包,而且使用起来可能还是有一些比较明显的bug,所以目前我这里建议如果没有使用到一些高版本的特性功能的话直接用这两个版本学习就足够了,可能后续都需要切换到Qt6了,就像我当时接触的时候很多还是Qt4,但是目前慢慢都是Qt5,很可能随着发展基本都用Qt6了,所以学习时不必太纠结于版本,系统了解学习一下Qt开发,后续的一些其它UI开发也可以使用类似的套路去学习,就能快速掌握了。
之前的5.9.1安装有过一些总结,可以参考一下:juejin.cn/post/711781…
这里再针对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 multiverse
deb http://mirrors.aliyun.com/ubuntu/ bionic-security main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ bionic-security main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ bionic-updates main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ bionic-updates main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ bionic-proposed main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ bionic-proposed main restricted universe multiverse
deb 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的下载地址:download.qt.io/archive/qt/…
ubuntu下我们下载download.qt.io/archive/qt/…即可。
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
如果编译时报错:-1: 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的内容还需要一些其它系统总结来呈现。