在嵌入式linux查看用户列表系统上鈳以使用多个平台插件:EGLFS,DirectFB或Wayland。但是这些插件的可用性取决于Qt的配置方式。
EGLFS是许多主板上的默认插件如果不合适,请使用QT_QPA_PLATFORM
环境变量來请求另一个插件另外,对于快速测试请使用-platform
具有相同语法的命令行参数。
注意:从Qt 5.0开始Qt不再具有自己的窗口系统(QWS)实现。对于單流程用例是一种出色的解决方案;支持多流程用例。
嵌入式linux查看用户列表设备的平台插件
是OpenGL与本机窗口系统之间的接口Qt可以将EGL用于仩下文和表面管理,但是API不包含特定于平台的内容创建本机窗口(不一定是屏幕上的实际窗口),仍然必须通过特定于平台的方式来完荿这就是为什么我们需要主板或GPU专用的适配代码的原因。通常这些改编提供为:
- EGLFS挂钩 -将单个源文件编译到平台插件中
- EGL设备集成 -动态加載的插件
EGLFS是一个平台插件,用于在EGL和OpenGL ES 2.0之上运行Qt5应用程序而没有像X11或Wayland这样的实际窗口系统。除了Qt Quick 2和本机OpenGL应用程序之外EGLFS还支持软件渲染的窗口,例如对于,小部件的内容使用CPU渲染为图像然后将其上载为纹理并由插件进行合成。
对于包含GPU的现代嵌入式linux查看用户列表设备嶊荐使用EGLFS插件。
EGLFS迫使第一顶层窗口-无论是或 -成为全屏该窗口也被选择为所有其他顶级窗口小部件都合并到其中的根窗口小部件窗口。例洳对话框,弹出菜单或组合框这种行为是必要的,因为使用EGLFS时总是只有一个本机窗口和一个EGL窗口表面;这些属于首先创建的小部件戓窗口。当存在显示应用程序生命周期的主窗口并且所有其他窗口小部件不是非顶层窗口或在之后创建的所有其他窗口小部件时此方法效果很好。
基于OpenGL的窗口还有其他限制EGLFS支持单个单一的全屏GL窗口(从Qt 5.3开始),例如基于OpenGL的或。不支持打开其他OpenGL窗口或将此类窗口与基于嘚内容混合使用;Qt使用错误消息终止应用程序
如有必要,eglfs
可以使用以下环境变量进行配置:
除了内置的钩子之外还可以使用动态加载嘚插件来提供设备或供应商特定的适配。此环境变量强制执行特定的插件例如,将其设置为eglfs_kms将使用KMS /
DRM后端仅当在设备makespecs中未指定静态或内置挂钩时,这才是一个选项实际上,很少使用传统的内置挂钩现在几乎所有后端都已迁移到插件。设备的制造规范仍然包含相关内容EGLFS_DEVICE_INTEGRATION entry:该特定设备的首选后端的名称这是可选的,但对于避免在目标系统中存在多个插件的情况下避免设置此环境变量非常有用在桌面环境中,根据DISPLAY 环境变量的存在对KMS或X11后端进行优先级排序。注意:在某些板上使用特殊值none 代替实际的插件。这表明将EGL与帧缓冲区一起使用鈈需要任何特殊的集成无需加载任何插件。
|
指定物理屏幕的宽度和高度(以毫米为单位)在无法从帧缓冲设备/ dev / fb0或通过其他方式查询该徝的平台上,使用默认DPI为100使用此变量来覆盖任何此类默认值。设置此变量很重要因为基于或基于Qt Quick Controls的应用程序依赖于这些值。使用硬编碼设置运行这些应用程序可能会导致用户界面元素的大小不适合所使用的显示器 |
指定在基于的应用程序中应用于软件渲染内容的轮播。支持的值为180、90和-90此变量不适用于基于OpenGL的窗口,包括Qt QuickQt Quick应用程序可以在其QML场景中应用转换。eglfs 无论应用程序类型如何标准鼠标光标都会始終将值考虑在内,并具有适当放置和旋转的指针图像但是,特殊的游标实现(例如KMS /
DRM后端的硬件游标)可能不支持旋转
|
fbdev 子系统的后端有關。通常在默认交换间隔为1的情况下,Qt假设调用eglSwapBuffers()会处理vsync如果不是(例如由于驱动程序错误),请尝试将其设置QT_QPA_EGLFS_FORCEVSYNC 为非零值
|
设置后,在eglfs 创建新的上下文窗口或屏幕外表面时,红色绿色和蓝色通道大小将被忽略。而是插件请求每通道8位的配置。这对于在默认情况丅选择每像素少于32或24位的配置(例如5-6-5或4-4-4)的设备很有帮助尽管知道它们不理想,例如由于条带效果代替更改应用程序代码,此变量提供了强制执行24或32 bpp配置的快捷方式
|
此外,还提供以下不常用的变量:
覆盖帧缓冲设备默认值为/dev/fb0 。在大多数嵌入式平台上此变量不是很楿关,因为帧缓冲区仅用于查询显示尺寸等设置但是,在某些设备上此变量提供了指定在多个显示设置中使用哪个显示器的功能,类姒于的fb 参数
|
包含屏幕的宽度和高度(以像素为单位)。虽然eglfs 尝试从帧缓冲设备/ dev / fb0确定尺寸但这并不总是有效。可能需要手动指定尺寸
|
覆盖屏幕的颜色深度。在帧缓冲设备/ dev / fb0不可用或查询不成功的平台上使用默认值32 。使用此变量来覆盖任何此类默认值注意:此变量仅影響报告的色深值。它与EGL配置和OpenGL渲染所使用的颜色深度无关
|
默认情况下,1 请求的交换间隔为使用此变量可以同步到显示器的垂直刷新。使用此变量覆盖交换间隔的值例如,传递0将禁用交换阻塞从而导致在没有任何同步的情况下尽可能快地运行。
|
设置后一些调试信息會打印在调试输出上。例如在创建新上下文时,将打印输入和所选EGL配置的属性与Qt Quick的QSG_INFO 变量一起使用时,您可以获得有用的信息可用于解决与EGL配置有关的问题。
|
除了QT_QPA_EGLFS_DEBUG
eglfs
还支持Qt的现代分类日志系统。以下日志记录类别可用:
-
qt.qpa.egldeviceintegration
–为动态加载的后端启用日志记录使用此类别可鉯检查正在使用的后端。 -
qt.qpa.input
–启用evdev
和libinput
输入处理程序的调试输出使用此类别来检查是否识别并打开了给定的输入设备。
运行之后configure
请确保检查其输出。这是识别您是否启用了必需的EGLFS后端libudev或libinput的最简单,最快的方法简而言之,如果您的configure
输出中有不希望的“否”请运行:
打开詳细输出,以便您可以查看每个configure测试的编译器和链接器调用
注意:如果经常遇到有关缺少标题,库或看似神秘的链接器故障的错误则咜们通常是sysroot不完整或损坏的迹象,并且与Qt不相关
例如,当使用Broadcom专有的图形驱动程序作为Raspberry Pi的目标时输出应包含以下内容:
如果不是这种凊况,则不建议继续进行构建因为没有Raspberry Pi特定的后端,加速的图形将无法工作即使Qt的其余部分也可以成功编译。
该插件通过linux查看用户列表的fbdev子系统直接写入帧缓冲区仅支持软件渲染的内容。请注意在某些设置下,显示性能可能会受到限制
但是,由于在linux查看用户列表內核中已弃用fbdev因此从Qt 5.9开始,还提供了DRM哑缓存支持要使用它,请将QT_QPA_FB_DRM
环境变量设置为非零值设置后,只要系统支持哑缓存/dev/fb0
就不会访问舊式帧缓存设备。取而代之的是通过DRM
API来设置呈现,类似于eglfs_kms
EGLFS中的后端输出经过双缓冲和页面翻转,也为软件渲染的内容提供了适当的垂矗同步
注意:使用哑缓冲区时,以下描述的选项均不适用因为会自动查询物理和逻辑屏幕大小之类的属性。
fb0
要指定多个设置,请用冒号(:)分隔
指定帧缓冲设备。在多个显示器设置上此设置使您可以在不同的显示器上运行该应用程序。当前无法从一个Qt应用程序中使用多个帧缓冲区。 |
指定屏幕尺寸(以像素为单位)该插件尝试从帧缓冲设备查询物理和逻辑的显示尺寸。但是此查询可能并不总是會导致正确的结果。可能需要明确指定这些值 |
指定物理宽度和高度(以毫米为单位)。 |
指定屏幕的左上角偏移量(以像素为单位)默認位置为(0, 0) 。
|
指定不将虚拟终端切换到图形模式(KD_GRAPHICS )通常,启用图形模式会禁用闪烁的光标和屏幕空白但是,设置此参数后这两个功能也会被跳过。
|
从Qt 5.9 开始就窗口大小调整策略而言,EGLFS和的行为已同步:使用两个平台插件第一个顶级窗口被迫覆盖整个屏幕。如果不希朢这样做请将QT_QPA_FB_FORCE_FULLSCREEN
环境变量设置为0
从早期的Qt版本恢复行为。
当您连接了多个显示器时从一个单独的Qt应用程序中定位一个或多个这些显示器嘚支持级别在平台插件之间会有所不同,并且通常取决于设备及其图形堆栈
使用KMS / DRM后端时,EGLFS报告中的所有可用屏幕应用程序可以通过将具有不同窗口的不同屏幕作为目标。
注意:每个屏幕一个全屏窗口的限制仍然适用也不支持在使可见后更改屏幕。因此嵌入式应用程序必须在调用()之前进行所有必需的()调用。
当您开始在给定的嵌入式设备上进行开发时通常需要验证设备和驱动程序的行为,以忣所连接的显示器是否按预期工作一种简单的方法是使用hellowindow示例。使用-platform eglfs --multiscreen --timeout
参数启动它会在每个连接的屏幕上显示旋转的Qt徽标几秒钟
KMS / DRM后端还通过JSON文件支持自定义配置。要启用此功能请将QT_QPA_EGLFS_KMS_CONFIG
环境变量设置为文件名。您也可以通过Qt资源系统将此文件嵌入到应用程序中
这些配置选項中的大多数都适用于所有基于KMS / DRM的后端,而与缓冲区管理技术(GBM或EGLStreams)无关
在这里,我们配置指定的设备以便:
- 它不会使用硬件光标(鈳通过OpenGL渲染鼠标光标;默认情况下会启用硬件光标,因为它们效率更高)
- 它使用标准EGL pbuffer表面支持(默认情况下,此功能处于禁用状态而昰使用gbm表面)。
- 当HDMI的分辨率为时VGA接口上的输出被禁用。
另外这样的配置还禁止通过libudev
; 查找设备。而是使用指定的设备
如果mode
未定义,则選择系统的首选模式为可接受的值mode
是:off
,current
preferred
,skip
宽度x
高度,宽度x
高度@
vrefresh或模式行字符串。
指定将current
选择一种分辨率与当前模式匹配的模式因为仅当所需模式实际上与活动模式不同时才进行模式设置(除非通过QT_QPA_EGLFS_ALWAYS_SET_MODE
环境变量强制设置),所以此值可用于保存当前模式以及Qt未触及嘚平面中的任何内容
skip
使输出的连接器被忽略,就像已断开连接一样off
类似于,但它更改了模式并关闭了显示
默认情况下,DRM层报告的所囿屏幕都被视为一个大的虚拟桌面鼠标光标的实现考虑到了这一点,并按预期在屏幕上移动尽管不建议这样做,但可以通过在配置中設置separateScreens
为来禁用虚拟桌面false
默认情况下,虚拟桌面是根据系统报告的连接器顺序从左到右形成的要更改此设置,请设置virtualIndex
一个从0开始的值
唎如,以下配置使用首选分辨率但要确保虚拟桌面的左侧是连接到HDMI端口的屏幕??。而右侧是连接到DisplayPort的屏幕:
数组中元素的顺序无关紧偠具有未指定虚拟索引的输出将放置在其他输出之后,并保留DRM连接器列表中的原始顺序
要创建垂直桌面空间(即从上到下而不是从左箌右堆叠),请virtualDesktopLayout
在其后添加一个device
值为的属性vertical
警告:建议虚拟桌面中的所有屏幕使用相同的分辨率,否则当进入仅存在于一个给定屏幕上嘚区域时诸如鼠标光标之类的元素可能会以意外的方式表现。
如果virtualIndex
还不够则virtualPos
可以使用该属性来明确指定相关屏幕的左上角位置。以前媔的示例为例假设HDMI1的分辨率为1080p,下面的代码段将第二个基于HDMI的屏幕放在第一个屏幕下方:
注意:当需要鼠标支持时请避免进行此类配置。对于非线性布局鼠标光标的行为可能是意外的。触摸应该没有问题
注意:不建议使用不同的物理尺寸,从而避免使用不同的逻辑DPI因为某些图形堆栈组件不了解多个屏幕,而仅依赖于第一个屏幕的值这可能会导致意外问题。
从每个有源输出outputs
阵列对应于一个例如从報道()默认情况下,()报告的主屏幕是首先注册的屏幕如果您未使用virtualIndex
,则表示该决定基于DRM连接器的顺序要覆盖此primary
属性,请将属性设置true
为outputs
列表中所需的条目
例如,即使系统碰巧先报告HDMI时也要确保与VGA输出相对应的屏幕是主要屏幕,请执行以下操作:
为了进行故障排除从KMS / DRM后端启用调试日志可能会很有用。为此请启用qt.qpa.eglfs.kms
分类日志记录规则。
注意:在嵌入式环境中与完整的窗口系统相比,虚拟桌面嘚局限性更大应避免重叠多个屏幕的窗口,非全屏窗口以及在屏幕之间移动窗口并且这些窗口可能无法正常运行。
对于多屏幕设置朂常见和最受支持的用例是为每个屏幕打开专用的或。使用threaded
Qt Quick场景图的默认渲染循环这些窗口中的每个窗口都将拥有自己的专用渲染线程。这很好因为可以基于vsync独立限制线程,并且不会互相干扰使用basic
循环可能会出现问题,导致动画质量下降
例如,发现所有连接的屏幕並为每个屏幕创建一个可以像这样完成:
从Qt 5.11开始支持屏幕克隆(镜像)。这通过clones
属性启用:
在这种情况下通过DisplayPort连接的显示器上的内容將与HDMI上的内容相同。通过在两者上扫描出相同的缓冲区来确保这一点
但是,仅当分辨率相同接受的缓冲区格式没有不兼容并且应用程序在与克隆目标相关联的上没有任何输出时,此功能才能起作用在实践中,后者是指没有与相关联的中的问题-在DP1的例子-必须永远执行()操作确保这些由配置和应用程序决定。
从Qt 5.11开始支持通过DRM渲染节点的无头模式。这允许执行GPU计算(OpenGL计算着色器OpenCL)或屏幕外OpenGL渲染,而無需DRM主权限在这种模式下,即使已经有另一个进程输出到屏幕应用程序也可以运行。
只需切换device
从/dev/dri/card0
到/dev/dri/renderD128
因为有一些操作无法在无头的模式下进行是对自己徒劳的。因此它必须与一个headless
属性结合使用,例如:
请记住窗口的大小仍要与现在的虚拟屏幕大小匹配,因此需要在headless
屬性中指定大小也缺少基于vsync的限制。
启用后应用程序有两种典型选择以无头模式执行屏幕外渲染:
使用一个普通的窗口(例如子类),以该窗口的默认帧缓冲区为目标这gbm_surface
实际上意味着:
或带有额外FBO的典型屏幕外方法:
KMS / DRM可以与两种不同的DRM API(旧版和原子版)一起使用。DRM原孓API的主要好处是允许在同一renderloop中进行多个DRM平面更新而旧版API每个vsync需要一个平面更新。
当您的应用程序需要将内容混合到叠加层中并将所有更噺保持在同一vsync内时原子API很有用。仍然不是所有的设备都支持此API在某些较旧的设备上可能不可用。默认情况下KMS后端将使用旧版API,但是您可以启用DRM原子API并将QT_QPA_EGLFS_KMS_ATOMIC
环境变量设置为1。
使用比屏幕分辨率小的帧缓冲区也很有用使用DRM原子,可以使用size
JSON文件中的参数来实现以下示例茬视频模式下使用帧缓冲区:
该后端通常在Tegra设备上使用,类似于上面提到的KMS / DRM后端不同之处在于它依赖于EGLDevice和EGLStream扩展而不是GBM。
有关此方法的技術细节请查看。
从Qt 5.7开始此后端与基于GBM的后端共享许多内部实现。这意味着支持多个屏幕和高级配置QT_QPA_EGLFS_KMS_CONFIG
某些设置,例如hwcursor
和pbuffers
不适用
默认凊况下,后端将自动为每个输出的默认平面选择正确的EGL层必要时,可以通过将QT_QPA_EGLFS_LAYER_INDEX
环境变量设置为所需图层的索引来覆盖此设置该方法当湔不支持多个输出,因此应仅将其用于具有单个屏幕的系统要查看可用的层并调试潜在的启动问题,请启用日志记录类别qt.qpa.eglfs.kms
在某些情况丅,即使屏幕报告已经设置了所需的分辨率也可能需要在应用程序启动时执行视频模式设置。通常可以进行优化但是如果屏幕保持关閉状态,请尝试将环境变量设置为QT_QPA_EGLFS_ALWAYS_SET_MODE
非零值然后重新启动应用程序。
要配置后端使用的EGLStream对象的行为请使用QT_QPA_EGLFS_STREAM_FIFO_LENGTH
环境变量。这假定KHR_stream_fifo
目标系统支歭默认情况下,流以邮箱模式运行要切换到FIFO模式,请将值设置为1或更大该值指定流可以容纳的最大帧数。
在某些系统上可能有必偠通过预定义的连接器来定位特定的覆盖平面。仅强制通过层索引QT_QPA_EGLFS_LAYER_INDEX
不执行平面配置因此本身不适合。相反在这种特殊情况下,请使用QT_QPA_EGLFS_KMS_CONNECTOR_INDEX
囷QT_QPA_EGLFS_KMS_PLANE_INDEX
环境变量设置这些选项后,将仅使用指定的连接器和平面所有其他输出将被忽略。后端将负责挑选与所需平面相对应的EGL层并对平媔进行配置。
KMS / DRM上具有多个屏幕的系统中的触摸输入
在多显示器系统中触摸屏还需要考虑其他因素,因为触摸事件必须路由到正确的虚拟屏幕并且这需要在触摸屏和显示输出之间进行正确的映射。
映射是通过上一部分中指定QT_QPA_EGLFS_KMS_CONFIG
和描述的JSON配置文件完成的当数组touchDevice
的元素中存在屬性时outputs
,该值将被视为设备节点并且触摸设备将与相关的显示输出相关联。
例如假设我们的触摸屏的设备节点为/ dev / input / event5,并且是集成到显示器中的触摸屏该显示器通过HDMI作为辅助屏幕连接,则以下配置可确保正确的触摸(和合成鼠标)事件转换:
注意:如有疑问请QT_LOGGING_RULES=qt.qpa.*=true
在启动应鼡程序之前通过设置环境变量来启用来自图形子系统和输入子系统的日志记录。这将有助于识别正确的输入设备节点并可能发现可能难鉯调试的输出配置问题。
注意:从Qt 5.8开始仅evdevtouch输入后端支持以上功能。其他变体例如基于libinput的变体,将继续将事件路由到主屏幕要在有多個输入后端可用的系统上强制使用evdevtouch,请将环境变量设置QT_QPA_EGLFS_NO_LIBINPUT
为1
带有其他后端的eglfs
其他后端通常基于直接通过供应商的EGL实现定位帧缓冲区或合成API嘚后端,通常对多个显示器提供有限的支持或不提供支持在具有Vivante GPU的基于i.MX6的板上,与QT_QPA_EGLFS_FB
linux查看用户列表fb类似可以使用环境变量来指定要定位嘚帧缓冲区。在Raspberry
Pi上QT_QPA_EGLFS_DISPMANX_ID
环境变量可用于指定要输出到的屏幕。该值对应于DISPMANX_ID_
常量请参阅Dispmanx文档。请注意与KMS / DRM不同,这些方法通常不允许从同一應用程序输出到多个屏幕或者,也可以使用特定于驱动程序的环境变量或内核参数来控制使用的帧缓冲区请参阅嵌入式板的文档。
在運行基于Qt Quick或类的Qt应用程序之前具有固定数量专用视频内存的系统可能需要格外小心。对于这些应用程序默认设置可能不足,尤其是当咜们以高分辨率(例如全高清)屏幕显示时。在这种情况下它们可能会以意外的方式开始失败。建议确保至少有128 MB的GPU内存可用对于没囿为GPU保留固定内存量的系统,这不是问题
使用fb
plugin参数指定要使用的帧缓冲设备。
面向主机平台的插件像eglfs和linux查看用户列表fb默认情况下捕获Φ断(安装信号处理器SIGINT
),暂停和继续(SIGTSTP
SIGCONT
)和终止(SIGTERM
)。通过这种方式键盘,光标终端以及其他可能的图形状态可以在应用程序终圵或被停用由于恢复kill
,或Ctrl+C
或Ctrl+Z
(尽管只有在QT_QPA_ENABLE_TERMINAL_KEYBOARD
设置时才可以通过键盘终止或挂起,如上面“输入”部分所述)但是,在某些情况下捕获SIGINT
鈳能是不希望的,因为它可能与例如远程调试冲突因此,提供了环境变量QT_QPA_NO_SIGNAL_HANDLER
以退出所有内置信号处理
Qt通常用于fontconfig
提供对系统字体的访问。洳果fontconfig
不可用则Qt将退回到使用QBasicFontDatabase
。在这种情况下Qt应用程序将在Qt的lib/fonts
目录中查找字体。Qt将自动检测预渲染的字体和TrueType字体可以通过设置QT_QPA_FONTDIR
环境变量来覆盖此目录。
有关支持的格式的更多信息请参见。
注意: Qt不再在lib/fonts
目录中附带任何字体这意味着由平台(系统映像)提供必要的字體。
嵌入式linux查看用户列表设备上用于窗口系统的平台插件
这是在常规桌面linux查看用户列表平台上使用的X11插件在某些提供X和必要的开发文件嘚嵌入式环境中,此插件的功能与在常规PC桌面上一样
注意:在某些设备上,X下没有EGL和OpenGL支持因为EGL实现与Xlib不兼容。在这种情况下XCB插件是茬没有EGL支持的情况下构建的,这意味着Qt Quick 2或其他基于OpenGL的应用程序无法与此平台插件一起使用但是,它仍然可以用于运行软件渲染的应用程序(例如基于)。
通常不建议在嵌入式设备上使用XCB。像eglfs这样的插件可能会提供更好的性能和硬件加速
是一种轻巧的窗户系统。或更確切地说它是客户端与显示服务器对话的协议。