1.Qt Embedded:简介与平台插件介绍
2.源码阅读忆丛(37)Minigui
Qt Embedded:简介与平台插件介绍
嵌入式Linux图形界面包括Qt/Embedded、源码DirectFB、源码MicroWindows/NanoX、源码MiniGUI和OpenGUI等,源码各有特点和应用场合。源码Qt在嵌入式环境中的源码淘宝特价源码分支平台Qt/E,通过调整原始Qt以节省内存,源码摒弃Xlib,源码采用Framebuffer作为底层图形接口,源码简化应用程序直接写入内核帧缓冲的源码操作。
Qt/E的源码编译流程需下载源代码,使用交叉编译器编译生成Qt库,源码库需在开发主机和目标板上各保留一份,源码供编译和运行时动态加载使用。源码此过程需具备Qt源代码、源码交叉编译器以及创造性思维。代码时钟无源码移植Qt/E至硬件平台时,先编译Qt库,然后将库复制至开发主机与目标板。使用命令行参数或环境变量配置移植过程。
Qt/E在嵌入式Linux设备上可使用多种平台插件,如EGLFS、LinuxFB、DirectFB、Wayland等,选择依据Qt配置。EGLFS是Qt5应用运行的默认平台插件,支持OpenGL ES2.0,通过硬件加速提供渲染,推荐在具备GPU的现代嵌入式设备上使用。EGLFS配置环境变量可调整显示参数,王慧文源码如日志记录、清屏行为等。LinuxFB通过Linux fbdev子系统直接写入帧缓冲区,仅支持软件渲染,使用环境变量配置显示参数,如指定fb设备。DirectFB为轻量级图形库,提供硬件加速、多层显示和输入设备处理,适用于嵌入式系统,支持多种显示卡、输入设备及图像文件格式。XCB插件在具备X和XCB开发文件的嵌入式环境中提供与桌面Linux平台相似的功能。Wayland作为一种轻量级窗户系统,Qt提供Wayland平台插件,知念信源码允许Qt应用程序连接到Wayland合成器。
配置环境变量时,以树莓派为例,追加内容到/etc/profile,根据需求修改。字体配置通常使用fontconfig访问系统字体,若不可用则退回到QBasicFontDatabase,通过QT_QPA_FONTDIR环境变量覆盖字体目录。Qt不再在lib/fonts目录提供字体,由平台提供必要字体。
Unix信号处理程序默认捕获中断、暂停、继续和终止信号,通过QT_QPA_ENABLE_TERMINAL_KEYBOARD设置允许通过键盘终止或挂起程序。在某些情况下,画横线公式源码捕获SIGINT可能与远程调试冲突,可通过QT_QPA_NO_SIGNAL_HANDLER环境变量退出内置信号处理。
源码阅读忆丛()Minigui
探索GUI的历史与实现
对于GUI的细节仍然存在一些困惑,似乎总是有新的东西需要学习。年轻时,对《Windows程序设计》、MFC等书籍充满热情,那些API的神奇之处让人着迷。然而,花费大量时间深入学习,却似乎事倍功半,微软似乎更倾向于教人如何使用,而非深入解释实现原理。尽管如此,还是尝试实现过文字版的GUI,涉及基本的按钮、滚动条、菜单等元素。但一些细节仍不清楚。
通过网络搜索,了解到魏永明的Minigui项目是对Windows GUI和GDI的模仿。通过下载vc6版本的MinGUI,能够进行调试。在分析代码时,发现事件回调、消息链等常见功能并无特别之处。而DefaultMainWinProc、InvalidateRect、PopupMenuTrackProc等函数则更具实际意义。GUI就像是在显存沙漠中绘画,有其既定规则。DefaultMainWinProc负责实现画最大、最小按钮、窗口方框等常规操作,而绘制的动作有其先后顺序,即消息的先后处理。
GDI部分则展示了如何在显存中书写文字,包括粗体、斜体等效果;如何绘制图标和位图;关键的rgn裁剪矩形技术,用于加速绘制,矩形外的绘制不会进行。rgn裁剪矩形的运算包括加、减、合、并等,对应着窗口的各种移动和形状改变。不同线程之间的窗口管理由HWND_DESKTOP统一处理,desktop-common.c相当于窗口管理器,不同程序无法直接获取其他窗口的位置和大小,由其进行统一管理。desktop包含三个线程,分别负责捕捉键盘、鼠标消息,以及实际消息的处理,以及窗口给desktop的消息交由DesktopWinProc统一处理。
MinGUI的模拟版本在调试方面虽能使用,但功能实现上有缺失。相比之下,libminigui-1.0.提供了完整的gui、gdi、kernel代码,定义了大部分的画窗套路和动作,只需要关注关键部分和自己定义的动作即可。
Linux的GUI采用了xwindows,通过socket将xclient进程中的窗口绘制信息传输到xserver,由xserver统一处理。xclient之间互相不知道窗口的位置和大小,因此都通过xserver进行绘制,xserver还包含了窗口管理器。而MinGUI在一个进程的多个线程中实现,不存在窗口管理器与进程间位置信息传递的问题。
Windows使用wink.sys作为窗口管理器,作为内核态程序,用户态的动态链接库在不同进程间数据段不同,但内核态的数据段统一,因此实现了窗口管理。Windows显示流畅的原因之一在于窗口管理机制与MinGUI的desktop类似,但实现机制有所不同。
工作繁忙,业余时间进行学习。尽管以前对GUI有过大量无用功,但这次的探索仅用几天时间便有所收获。