天天看點

Qt和嵌入式Linux

自從Qt 5.0釋出以來,Qt不再包含自己的視窗系統(QWS)實作。對于單程序用例,Qt平台抽象是一個優秀的解決方案。Wayland可以支援多種圖形化流程。

有多個平台插件可能在嵌入式Linux系統上可用:EGLFS,LinuxFB,DirectFB,Wayland。這些可用性取決于Qt的配置。在許多闆上選擇eglfs作為預設選項。如果預設值不合适,QT_QPA_PLATFORM則可以使用環境變量參數來請求另一個插件。或者,對于快速測試,-platform指令行可以使用相同的文法。

配置特定裝置

對于給定的裝置建構Qt需要一個工具鍊和一個sysroot。另外,一些裝置需要針對EGL和OpenGLES 2.0支援的供應商特定的适配代碼。這與非加速平台無關,例如使用LinuxFB插件的平台,僅用于基于軟體的渲染。

目錄qtbase/ mkspecs / devices包含許多裝置的配置和圖形适配代碼。例如,linux-rasp-pi2-g++mkspec包含建構設定,如Raspberry Pi 2裝置的最佳編譯器和連結器标志。mkspec還包含有關eglfs鈎子的實作(供應商特定的适配代碼)的資訊,或者是對适合的eglfs裝置內建插件的引用。通過配置工具的-device參數選擇裝置。在此參數之後的名稱必須至少部分地比對裝置下的一個子目錄。

以下是Raspberry Pi 2的示例配置。對于大多數嵌入式Linux闆,configure指令看起來類似:

./configure -release -opengl es2 -devicelinux-rasp-pi2-g ++ -device-option CROSS_COMPILE = $ TOOLCHAIN / arm-bcm2708 /gcc-linaro-arm-linux-gnueabihf-raspbian / bin / arm-linux-gnueabihf- -sysroot $ROOTFS -prefix / usr / local / qt5

最重要的參數是-device和-sysroot。通過指定-sysroot,configure特征檢測測試使用的包含檔案和庫以及Qt本身,取自指定的位置,而不是主機PC的标準位置。這意味着在主機上安裝開發包是無關緊要的。例如,要獲得libinput支援libinput,在主機環境中安裝開發頭和庫是不夠的。相反,目标架構(例如ARM)的标頭和庫必須存在于sysroot。

pkg-config在執行交叉編譯時也得到支援。configure自動設定PKG_CONFIG_LIBDIR為pkg-config基于sysroot代替主機的報告編譯器和連結器設定。這通常功能很好,沒有任何進一步的調整。但是,PKG_CONFIG_PATH運作前,主機必須先設定環境變量configure。否則,Qt建構可能會嘗試從主機系統使用不适當的頭檔案和庫。

指定-sysroot在--sysroot調用編譯器時自動設定參數的結果。在某些情況下,這是不可取的,可以通過傳遞-no-gcc-sysroot來禁用configure。

-prefix,-extprefix并-hostprefix控制Qt建構的目标目标目錄。在上述示例中,Qt的ARM版本預計将放置在/usr/local/qt5目标裝置上。請注意,運作make install不會部署任何裝置。相反,該install步驟将目标指定的目錄extprefix預設為sysroot+ prefix,是以是可選的。然而,在很多情況下,“污染”是不可取的,是以指定-extprefix變得重要。最後,-hostprefix允許從目标的二進制檔案分離主機工具,如qmake,rcc,uic。給定時,這些工具将安裝在指定的目錄下,而不是extprefix。

有關詳細資訊,請參閱Qt配置選項。

嵌入式Linux裝置的平台插件

EGLFS

EGL是OpenGL和本機視窗系統之間的接口。Qt可以使用EGL進行上下文和表面管理,但是API不包含平台特定的内容:建立本機視窗(這不一定是螢幕上的實際視窗)仍然必須通過平台特定的方式完成。是以需要闆或GPU特定的适配代碼。這樣的修改可以被提供為eglfs鈎子,其可以是編譯到平台插件中的單個源檔案,或作為動态加載的EGL裝置內建插件。

EGLFS是一個平台插件,用于在沒有實際的視窗系統(如X11或Wayland)的EGL和OpenGLES 2.0之上運作Qt5應用程式。除了QtQuick 2和本機OpenGL應用程式,它還支援軟體渲染的視窗(例如QWidget)。在後一種情況下,小部件的内容将使用CPU渲染成圖像,然後将其上傳到紋理并由插件合成。

這是包含GPU的現代嵌入式Linux裝置的推薦插件。

EGLFS強制第一個頂級視窗(無論是QWidget還是QQuickView)成為全螢幕。此視窗也被選擇為根部件視窗視窗,其中所有其他頂級視窗小部件(例如對話框,彈出菜單或組合框下拉清單)都被合成。這是必要的,因為使用EGLFS總是有一個本機視窗和EGL視窗表面,這些視窗屬于首先建立的視窗小部件或視窗。當主視窗在整個應用程式的整個生命周期中存在,并且所有其他視窗小部件都是非頂層或之後建立的主視窗顯示時,此方法運作良好。

對于基于OpenGL的視窗還有其他限制。從Qt 5.3起,eglfs支援一個全屏GL視窗(例如,基于OpenGL的QWindow,QQuickView或QGLWidget)。打開額外的OpenGL視窗或混合這些視窗與基于QWidget的内容是不支援的并終止應用程式與錯誤消息。

如有必要,eglfs可以使用以下環境變量進行配置:

·        QT_QPA_EGLFS_INTEGRATION-除了編譯的鈎子之外,還可以以動态加載的插件的形式提供裝置或供應商特定的适配。這個環境變量強制執行一個特定的插件。例如,将其設定為eglfs_kms使用KMS/ DRM後端。這隻是在裝置makepecs中沒有指定靜态或編入鈎子的選項。在實踐中,傳統的編入鈎子很少被使用,幾乎所有後端都被遷移到插件。裝置制造商仍然包含相關EGLFS_DEVICE_INTEGRATION條目:該特定裝置的首選後端的名稱。這是可選的,但是非常有用,以避免在目标系統中存在多個插件的情況下設定此環境變量。DISPLAY在桌面環境中,根據環境變量的存在,KMS或X11後端是優先的。請注意,在某些電路闆上使用特殊的值none而不是實際的插件。這表明使用EGL與framebuffer不需要特殊的內建,是以不能加載插件。

·        QT_QPA_EGLFS_PHYSICAL_WIDTH和QT_QPA_EGLFS_PHYSICAL_HEIGHT-實體螢幕寬度和高度以毫米為機關。在不能從幀緩沖裝置/ dev / fb0或其他方式查詢值的平台上,使用預設DPI為100。此變量可用于覆寫任何此類預設值。設定此選項很重要,因為基于QWidget或QtQuick Controls的應用程式依賴于這些值。使用寫死設定運作可能會導緻使用者界面元素大小不适合在使用中顯示。

·        QT_QPA_EGLFS_ROTATION-指定在基于QWidget的應用程式中應用于軟體渲染内容的旋轉。支援的值為180,90和-90。這不适用于基于OpenGL的視窗,包括QtQuick。QtQuick應用程式可以在QML場景中應用轉換。無論應用程式類型如何,标準的eglfs滑鼠光标總是考慮到該值,具有适當定位和旋轉的指針圖像。特殊光标實作(如KMS/ DRM後端的硬體光标)可能不支援旋轉。

·        QT_QPA_EGLFS_FORCEVSYNC-設定後,每次調用eglSwapBuffers()後,幀緩沖裝置上的eglfs請求FBIO_WAITFORVSYNC。這僅适用于依賴于fbdevLinux 的傳統子系統的後端。通常,預設交換間隔為1,Qt假定調用eglSwapBuffers()處理vsync; 如果沒有(例如,由于驅動程式錯誤),請嘗試設定QT_QPA_EGLFS_FORCEVSYNC為非零值。

·        QT_QPA_EGLFS_FORCE888 -設定時,在建立新的上下文,視窗或螢幕外表面時,将忽略紅色,綠色和藍色顔色通道大小。相反,插件要求每個通道8位配置。這對于在預設情況下選擇具有小于32或24位/像素(例如5-6-5或4-4-4)的配置的裝置可能是有用的,但是已知不是理想的,例如,由于綁帶效應。而不是更改應用程式代碼,此變量提供了一個更容易的快捷方式來強制24或32 bpp配置。

此外,以下 - 較不常用的變量也可用:

·        QT_QPA_EGLFS_FB -覆寫幀緩沖裝置。預設是/dev/fb0。在大多數嵌入式平台上,這不是很相關,因為幀緩沖區僅用于查詢顯示次元等設定。然而,在某些裝置上,該參數提供了指定要在多個顯示設定中使用的顯示的功能,類似于LinuxFB中的fb參數。

·        QT_QPA_EGLFS_WIDTH和QT_QPA_EGLFS_HEIGHT-包含螢幕寬度和高度(以像素為機關)。在eglfs嘗試從framebuffer裝置/ dev / fb0中确定尺寸時,但是這并不總是和手動指定大小可能變得必要。

·        QT_QPA_EGLFS_DEPTH -覆寫螢幕的顔色深度。在framebuffer裝置/ dev / fb0不可用或查詢不成功的平台上,使用預設值32。此變量可用于覆寫任何此類預設值。請注意,這僅影響QScreen報告的顔色深度值。它與EGL配置和OpenGL渲染使用的顔色深度無關。

·        QT_QPA_EGLFS_SWAPINTERVAL-預設情況下1将要求交換間隔。這使得能夠與顯示器垂直重新整理同步。該值可以用此環境變量覆寫。例如,傳遞0将禁用交換阻塞,導緻盡可能快地運作而沒有任何同步。

·        QT_QPA_EGLFS_DEBUG -設定時,調試輸出上會列印一些調試資訊。例如,輸入的QSurfaceFormat和所選EGL配置的屬性在建立新上下文時列印。與QtQuick的QSG_INFO變量一起,可以為與EGL配置相關的故障排除提供有用的資訊。

除此之外QT_QPA_EGLFS_DEBUG,eglfs還支援更現代的Qt分類日志記錄系統。以下日志記錄類别可用:

·        qt.qpa.egldeviceintegration -為動态加載的後端啟用日志記錄。非常有用的檢查後端是否正在使用。

·        qt.qpa.input-啟用來自evdev和libinput輸入處理程式的調試輸出。檢查給定輸入裝置是否被識别和打開非常有用。

·        qt.qpa.eglfs.kms -在KMS/ DRM後端啟用詳細日志記錄。

運作後configure,確定檢查其輸出。由于相應的配置測試失敗,沒有啟用必要的eglfs後端,libudev或libinput是相當常見的問題,可以通過這種方式快速識别。當有不想要的“不”的結果,運作configure與-v才能看到編譯器和連結調用每個配置測試打開詳細輸出。

注意:關于缺少标題,庫或似乎隐含的連結器故障的錯誤通常是不完整或破碎的sysroot的标志,與Qt無關,也不能被Qt解決。

例如,當使用Broadcom專有圖形驅動程式定位RaspberryPi時,輸出應包含以下内容。如果不是這樣,沒有必要進一步進行建構,因為如果沒有RaspberryPi特定的後端,加速圖形将不起作用,即使Qt的其餘部分成功編譯。

QPA後端:

EGLFS ................................是的

EGLFS詳細資訊:

EGLFS i.Mx6........................ no

EGLFS i.Mx6 Wayland................ no

EGLFS EGLDevice.................... no

EGLFS GBM.......................... no

EGLFS馬裡.........................

EGLFS Rasberry Pi..................是的

XL上的EGL.........................

該插件通過Linux的fbdev子系統直接寫入幀緩沖區。隻支援軟體渲染内容。請注意,在某些設定上,顯示性能預計将受到限制。

從Qt 5.9開始,由于fbdev在Linux核心中被棄用,DRMdumb緩沖區支援也是可用的。必須通過将QT_QPA_FB_DRM環境變量設定為非零值來請求。當設定時,隻要系統支援啞緩沖區,傳統的幀緩沖裝置/dev/fb0就不會被通路。相反,通過DRMAPI設定渲染,類似于eglfs_kmseglfs 的後端。輸出将被雙緩沖和頁面翻轉,為軟體渲染内容提供适當的vsync。

注意:當使用啞緩沖區時,以下所述的任何選項都不适用,因為實體和邏輯螢幕尺寸等屬性都将被自動查詢。

該linuxfb插件允許通過将它們傳遞給QT_QPA_PLATFORM環境變量或-platform指令行選項來指定其他設定。例如,QT_QPA_PLATFORM=linuxfb:fb=/dev/fb1指定/dev/fb1必須使用幀緩沖裝置而不是預設值fb0。可以通過用冒号分隔多個設定來指定多個設定。

·        fb=/dev/fbN -指定幀緩沖裝置。在多個顯示設定上,這通常允許在不同顯示器上運作應用程式。暫時沒有辦法從一個Qt應用程式使用多個幀緩沖區。

·        size=<width> x<height> -指定螢幕大小(以像素為機關)。插件嘗試從framebuffer裝置查詢實體和邏輯的顯示次元。然而,這可能并不總是導緻正确的結果,是以可能需要明确指定值。

·        mmsize=<width> x<height> -實體寬度和高度(以毫米為機關)。

·        offset=<width> x<height> -指定螢幕左上角的像素偏移量。預設位置在(0, 0)。

·        nographicsmodeswitch-不要将虛拟終端切換到圖形模式(KD_GRAPHICS)。除了切換到圖形模式外,閃爍的光标和螢幕消隐也通常被禁用。設定此參數時,也會跳過這些參數。

·        tty=/dev/ttyN -覆寫虛拟控制台。僅在nographicsmodeswitch未設定時使用。

從Qt 5.9起,在視窗大小調整政策中,eglfs和linuxfb的行為已被同步:第一個頂級視窗被迫使用兩個平台插件覆寫整個螢幕。如果不想這樣,環境變量設定QT_QPA_FB_FORCE_FULLSCREEN到0以恢複早期的Qt版本的行為。

輸入

當沒有視窗系統存在時,滑鼠,鍵盤,以及觸摸輸入是通過直接讀取evdev或使用輔助庫如libinput或tslib。請注意,這要求/dev/input/event*使用者可以讀取裝置節點。eglfs并linuxfb具有編譯的所有輸入處理代碼。

使用libinput

libinput是一個用于處理輸入裝置的庫。它提供了Qt自己的evdev輸入支援的替代方案。為了能夠使用libinput,請確定所開發的檔案libudev和libinput配置和建構Qt時可用。xkbcommon如果需要鍵盤支援,也是必需的。由于這些插件預設使用eglfs,是以linuxfb無需進一步的操作libinput。如果libinput支援不可用或環境變量QT_QPA_EGLFS_NO_LIBINPUT設定,Qt自己的evdev處理程式進來玩。

輸入eglfs和linuxfb而不用libinput

像裝置節點名稱參數可以在環境變量設定QT_QPA_EVDEV_MOUSE_PARAMETERS,QT_QPA_EVDEV_KEYBOARD_PARAMETERS和QT_QPA_EVDEV_TOUCHSCREEN_PARAMETERS。用冒号分隔條目。這些參數作為傳遞-plugin指令行參數中的設定的替代方法,并且對于某些後端,它們是至關重要的:eglfs和linuxfb使用内置的輸入處理程式,是以-plugin在使用中沒有單獨的參數。

此外,内置的輸入處理程式可以通過設定被禁用QT_QPA_EGLFS_DISABLE_INPUT或QT_QPA_FB_DISABLE_INPUT到1。

老鼠

滑鼠光标每當出現QT_QPA_EGLFS_HIDECURSOR(對于eglfs)或QT_QPA_FB_HIDECURSOR(對于linuxfb)未設定,Qt的基于libudev的裝置發現報告至少有一個滑鼠可用。當libudev不存在支援時,滑鼠光标始終顯示,除非通過環境變量顯式禁用。

支援熱插拔,但隻有當Qt配置了libudev支援(即,如果libudev開發頭在配置時在sysroot中存在)。這允許在應用程式運作時連接配接或斷開輸入裝置。

該了evdev滑鼠處理器支援以下額外的參數:

·        /dev/input/... -指定輸入裝置的名稱。當沒有給出時,Qt通過libudev或通過可用節點來查找合适的裝置。

·        nocompress -預設情況下,與最後一個Qt滑鼠事件相比,不會導緻更改位置的輸入事件被壓縮; 在更改位置或按鈕狀态後,才會發送新的Qt滑鼠事件。可以通過設定nocompress參數來禁用。

·        dejitter -指定抖動限制。預設情況下禁用消隐功能。

·        grab -當1,Qt将抓住裝置專用。

·        abs -一些觸摸屏報告絕對坐标,不能與觸摸闆區分開來。在這種特殊情況下,通過abs表示裝置正在使用絕對事件。

鍵盤

該了evdev鍵盤處理程式支援以下額外的參數:

·        /dev/input/... -指定輸入裝置的名稱。當沒有給出時,Qt通過libudev或通過可用節點來查找合适的裝置。

·        grab -啟用抓取輸入裝置。

·        keymap -指定自定義鍵盤映射檔案的名稱。

·        enable-compose -啟用合成。

·        repeat-delay -設定自定義鍵重複延遲。

·        repeat-rate -設定自定義鍵重複率。

在沒有停用終端會話的嵌入式Linux系統上,由于輸入事件由Qt應用程式和tty處理,按鍵上的行為可能會令人困惑。為了克服這一點,可以使用以下選項:

·        EGLFS和LinuxFB嘗試通過設定tty的鍵盤模式來禁用應用程式啟動時的終端鍵盤K_OFF。這樣可以防止鍵盤進入終端。如果由于某些原因需要恢複标準行為,請将環境變量設定QT_QPA_ENABLE_TERMINAL_KEYBOARD為1。請注意,僅當應用程式從遠端控制台(例如,通過ssh)啟動并且終端鍵盤輸入保持啟用時,該功能才起作用。

·        另一種方法是使用了evdev鍵盤處理程式的grab通過傳遞參數搶= 1在QT_QPA_EVDEV_KEYBOARD_PARAMETERS。這樣會導緻嘗試在輸入裝置上進行抓取。如果grab成功,隻要Qt應用程式運作,系統中沒有其他元件從中接收事件。這種方法更适合遠端啟動的應用程式,因為它不需要通路tty裝置。

·        最後,對于許多專門的嵌入式Linux圖像,首先啟用标準終端會話是沒有意義的。請參閱您的建構環境的文檔,了解如何禁用它們。例如,當使用Yocto Project生成圖像時,取消設定将SYSVINIT_ENABLED_GETTYS導緻getty任何虛拟終端無任何程序運作,進而導緻無輸入。

如果預設内置鍵盤映射不夠,可以通過keymap參數或使用eglfs特定的loadKeymap()函數指定不同的鍵盤映射。後者允許在運作時切換鍵盤映射。但是請注意,這需要使用eglfs的内置鍵盤處理程式; 當通過-plugin指令行參數加載鍵盤處理程式時,不支援它。

注意:目前不支援特殊的系統組合鍵,例如控制台切換(Ctrl + Alt + Fx)或zap(Ctrl + Alt + Backspace),并被忽略。

要生成自定義鍵盤映射,可以使用kmap2qmap實用程式。這可以在qttools子產品中找到。源檔案必須是标準的Linux kmap格式,這是核心的loadkeys指令所了解的。這意味着可以使用以下源生成qmap檔案:

·        在Linux控制台工具(LCT)項目。

·        Xorg X11鍵盤映射可以轉換kmap為該ckbcomp實用程式的格式。

·        由于kmap檔案是純文字檔案,它們也可以手工制作。

kmap2qmap是一個指令行程式,至少需要2個檔案作為參數。最後一個是生成的.qmap檔案,而其他所有檔案都被解析為輸入.kmap檔案。例如:

kmap2qmap i386 / qwertz /de-latin1-nodeadkeys.kmap include / compose.latin1.inc de-latin1-nodeadkeys.qmap

注意:kmap2qmap不支援Linux核心支援的所有(僞)符号。轉換标準鍵盤圖時,會顯示許多警告,關于Show_Registers,Hex_A等等; 這些消息可以安全地被忽略。

觸摸

對于一些電阻式單觸摸觸摸屏,可能需要退回使用,tslib而不是依賴于Linux多點觸控協定和事件裝置。對于現代觸摸屏,這是不必要的。tslib可以通過設定環境變量QT_QPA_EGLFS_TSLIB或QT_QPA_FB_TSLIB1 來啟用支援。要更改裝置,請TSLIB_TSDEVICE在指令行中設定環境變量或傳遞裝置名稱。請注意,tslib輸入處理程式生成滑鼠事件并支援單觸摸,而不是evdevtouch生成真正的多點觸控QTouchEvent事件。

該了evdev觸摸處理器支援以下額外的參數:

·        /dev/input/... -指定輸入裝置的名稱。當沒有給出時,Qt通過libudev或通過可用節點來查找合适的裝置。

·        rotate-在某些觸摸屏上,坐标必須旋轉,這可以通過設定rotate為90,180或270進行。

·        invertx和inverty- 反轉輸入事件中的X或Y坐标,通過invertx或inverty。

例如,exportQT_QPA_EVDEV_TOUCHSCREEN_PARAMETERS=/dev/input/event5:rotate=180在啟動應用程式之前,會導緻明确指定的觸摸裝置并翻轉坐标- 當實際螢幕和觸摸屏的方向不比對時很有用。

筆式平闆電腦

該evdevtablet插件為Wacom和類似的基于筆的平闆​​電腦提供了基本的支援。它僅生成QTabletEvent事件。要啟用它,請傳遞QT_QPA_GENERIC_PLUGINS=evdevtablet給環境,或者-plugin evdevtablet在指令行中傳遞參數。插件可以使用裝置節點參數,例如QT_QPA_GENERIC_PLUGINS=evdevtablet:/dev/event1,Qt的自動裝置發現(基于libudev或演練/dev/input/event*)不起作用或行為不正常的情況。

調試輸入裝置

通過啟用qt.qpa.input日志規則,例如通過将QT_LOGGING_RULES環境變量設定為,可以向調試輸出列印一些資訊qt.qpa.input=true。這對于檢測正在使用哪個裝置或對裝置發現問題進行故障排除非常有用。

使用自定義滑鼠光标圖像

eglfs自帶的32x32尺寸的滑鼠光标圖像。如果這些還不夠,可以通過将QT_QPA_EGLFS_CURSOR環境變量設定為JSON檔案的名稱來提供自定義遊标地圖集。該檔案也可以通過Qt的資源系統嵌入到應用程式中。

例如,每行具有8個光标圖像的嵌入式光标圖集可以指定如下:

{

“image”:“:/cursor-atlas.png”

“cursorsPerRow”:8,

“熱點”:[

[7,2]

[12,3]

[12,12]

...

]

}

請注意,圖像預計将緊緊地包裝在圖集中:光标的寬度和高度根據總圖像大小和cursorsPerRow設定決定。地圖集必須為所有支援的遊标提供圖像。

顯示輸出

當連接配接多個顯示器時,從一個單一Qt應用程式中定向一個或多個顯示器的支援級别在平台插件之間變化,并且通常取決于裝置及其圖形堆棧。

eglfs與eglfs_kms後端

當KMS / DRM背景正在使用時,eglfs報告QGuiApplication :: screens()中的所有可用螢幕。應用程式可以使用不同的視窗通過QWindow :: setScreen()來定位不同的螢幕。

注意:每個螢幕的一個全屏視窗的限制仍然适用。使QWindow可見後更改螢幕也不受支援。是以,嵌入式應用程式必須在調用QWindow :: show()之前進行所有必要的QWindow :: setScreen()調用。

當開始在給定的嵌入式裝置上開發時,通常需要驗證裝置和驅動程式的行為,并且所連接配接的顯示器應該是正常工作的。一個簡單的方法是使用hellowindow示例。用-platform eglfs--multiscreen --timeout參數啟動它在每個連接配接的螢幕上顯示一個旋轉的Qt标志幾秒鐘。

注意:下面描述的大多數配置選項适用于所有基于KMS/ DRM的後端,無論緩沖管理技術(GBM或EGLStreams)如何。

KMS / DRM後端還支援通過JSON檔案進行自定義配置。将環境變量設定為QT_QPA_EGLFS_KMS_CONFIG檔案的名稱以啟用此功能。該檔案也可以通過Qt資源系統嵌入到應用程式中。示例配置如下:

{

“device”:“/dev / dri / card1”,

“hwcursor”:false,

“pbuffers”:真的,

“輸出”:[

{

“name”:“VGA1”,

“關閉模式”

},

{

“name”:“HDMI1”,

“mode”:“1024x768”

}

]

}

這裡我們配置指定的裝置

·        它不會使用硬體光标(通過OpenGL退回渲染滑鼠光标;預設情況下,啟用硬體光标,因為它們更有效),

·        它将使用标準的EGLpbuffer表面傳回QOffscreenSurface(預設情況下,這是禁用的,而是使用gbm表面),

·        VGA連接配接器上的輸出被禁用,而HDMI處于活動狀态,分辨率為1024x768。

另外,這樣的配置也禁用尋找裝置libudev,而是使用指定的裝置。

何時mode未定義,系統選擇報告為首選的模式。為可接受的值mode是:off,current,preferred,寬度x高度,或模式行字元串。

預設情況下,DRM層報告的所有螢幕都将被視為一個大型虛拟桌面。滑鼠光标實作将考慮到這一點,并按預期在螢幕上移動。盡管不推薦,虛拟桌面模式可以通過設定被禁用separateScreens,以false在配置上,如果需要的話。

預設情況下,根據系統報告的連接配接器順序,虛拟桌面從左到右形成。這可以通過設定virtualIndex為從0開始的值來更改。例如,以下配置使用首選分辨率,但確定虛拟桌面中的左側是螢幕連接配接到HDMI端口,而右側是螢幕連接配接到DisplayPort:

{

“device”:“drm-nvdc”,

“輸出”:[

{

“name”:“HDMI1”,

“virtualIndex”:0

},

{

“name”:“DP1”,

“virtualIndex”:1

}

]

}

數組中的元素的順序是不相關的。具有未指定虛拟索引的輸出将放在其他虛拟索引之後,并保留DRM連接配接器清單中的原始順序。

要建立一個垂直的桌面空間(即,從上到下而不是從左到右堆疊),添加一個virtualDesktopLayout屬性後面device的值vertical。

注意:建議虛拟桌面中的所有螢幕使用相同的分辨率,否則像滑鼠光标那樣的元素可能會在輸入僅存在于一個給定螢幕上的區域時以意想不到的方式運作。

何時virtualIndex不夠,該屬性virtualPos可用于明确指定問題螢幕的左上角位置。以前面的例子,假設HDMI1的分辨率為1080p,下面第一個基于HDMI的螢幕放在第一個:

{

...

“輸出”:[

...

{

“name”:“HDMI2”,

“virtualPos”:“0,1080”

}

]

}

注意:在需要滑鼠支援時避免這樣的配置。滑鼠光标的行為可能是意想不到的非線性布局。Touch應該沒有問題。

在某些情況下,通過DRM自動查詢實體螢幕尺寸可能會失敗。通常QT_QPA_EGLFS_PHYSICAL_WIDTH,QT_QPA_EGLFS_PHYSICAL_HEIGHT環境變量将用于提供缺失值,但是當存在多個螢幕時,這并不适用。而是使用清單中的physicalWidth和physicalHeight屬性outputs來指定以毫米為機關的大小。

注意:不同的實體尺寸和不同的邏輯DPI不鼓勵,因為它可能會導緻意外的問題,因為一些圖形堆棧元件不知道多個螢幕,僅依靠第一個螢幕的值。

從每個有源輸出outputs陣列對應于一個QScreen從報告執行個體QGuiApplication ::螢幕()。QGuiApplication :: primaryScreen()報告的主螢幕是預設首先注冊的螢幕。當不使用時virtualIndex,這意味着決定是基于DRM連接配接器順序。要覆寫這一點,屬性設定primary,以true對在所需的條目outputs清單。例如,為了確定與VGA輸出相對應的螢幕将是主要的,即使系統首先報告HDMI,則可以執行以下操作:

{

“device”:“/dev / dri / card0”,

“輸出”:[

{“name”:“HDMI1”},

{“name”:“VGA1”,“mode”:“1280x720”,“primary”:true},

{“name”:“LVDS1”,“mode”:“off”}

]

}

為了進行故障排除,可能會啟用KMS / DRM後端的調試日志。為此,啟用分類日志記錄規則qt.qpa.eglfs.kms。

注意:在嵌入式環境中,虛拟桌面比全視窗系統更為有限。應該避免Windows重疊多個螢幕,非全屏視窗和螢幕之間的移動視窗,并且可能無法正常運作。

多螢幕設定最常用和最受支援的用例是為每個螢幕打開一個專用的QQuickWindow或QQuickView。使用threadedQt Quick場景圖的預設渲染循環,這些視窗中的每個都将獲得自己的專用渲染線程。這是很好的,因為線程可以基于vsync獨立調節,并且不會互相幹擾。通過basic循環,這可能會産生問題,動畫可能會是以而惡化。

例如,發現所有連接配接的螢幕,并為每個螢幕建立一個QQuickView可以這樣完成:

int main(int argc,char** argv)

{

QGuiApplication應用程式(argc,argv);

QVector<QQuickView *>視圖;

for(QScreen* screen:app.screens()){

QQuickView * view = new QQuickView;

視圖 - > setScreen(螢幕);

視圖 - > setResizeMode(QQuickView ::SizeRootObjectToView);

視圖 - >的SetSource(QUrl( “QRC:/main.qml”));

QObject :: connect(view-> engine(),&QQmlEngine :: quit,qGuiApp,&QCoreApplication:: quit);

views.append(視圖);

視圖 - > showFullScreen();

}

int result = app.exec();

qDeleteAll(視圖);

傳回結果;

}

eglfs與eglfs_kms_egldevice後端

通常在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連接配接的顯示器作為輔助螢幕的觸摸屏,以下配置確定正确的觸摸(和合成滑鼠)事件轉換:

{

“device”:“drm-nvdc”,

“輸出”:[

{

“name”:“HDMI1”,

“touchDevice”:“/ dev / input / event5”,

“virtualIndex”:1

},

{

“name”:“DP1”,

“virtualIndex”:0

}

]

}

注意:如有疑問,請QT_LOGGING_RULES=qt.qpa.*=true在啟動應用程式之前通過設定環境變量來啟用圖形和輸入子系統的日志記錄。這将有助于識别正确的輸入裝置節點,并且可能會發現可能難以調試的輸出配置問題。

注意:從Qt 5.8起,上述隻支援evdevtouch輸入後端。其他變體,例如基于libinput的變體,将繼續将事件路由到主螢幕。要強制在具有多個輸入後端的系統上使用evdevtouch,請将環境變量設定QT_QPA_EGLFS_NO_LIBINPUT為1。

eglfs與其他後端

通常基于通過供應商的EGL實作直接針對幀緩沖區或組合API的其他後端,通常對多個顯示器提供有限或不支援的支援。在使用VivanteGPU的基于i.MX6的電路闆上,與linuxfb類似,QT_QPA_EGLFS_FB環境變量可用于指定要緩存的幀緩沖區。在RaspberryPi上,QT_QPA_EGLFS_DISPMANX_ID環境變量可用于指定要輸出的螢幕。該值對應于其中一個DISPMANX_ID_常量,請參考Dispmanx文檔。請注意,與KMS/ DRM不同,這些方法通常不允許從同一應用程式輸出到多個螢幕。或者,驅動程式特定的環境變量或核心參數也可以用于控制所使用的幀緩沖區。參考嵌入式闆“

視訊記憶體

具有固定數量的專用視訊記憶體的系統在運作基于Qt Quick的Qt應用程式或類似QOpenGLWidget的類之前,可能需要特别注意。對于這樣的應用,預設設定可能不足,特别是當它們以高分辨率(例如,全高清)螢幕顯示時。在這種情況下,他們可能以意想不到的方式開始失敗。建議確定至少有128MB的GPU記憶體可用。對于沒有為GPU保留的固定記憶體量的系統,這不是一個問題。

linuxfb

使用fbplugin參數指定要使用的framebuffer裝置。

Unix信号處理程式

面向控制台的平台插件,如eglfs和linuxfb預設安裝信号處理程式來捕獲interrupt(SIGINT),suspend和continue(SIGTSTP,SIGCONT)和terminate(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環境變量來覆寫此目錄。

有關支援的格式的詳細資訊,請參閱嵌入式Linux字型的Qt。

注意: Qt不再在lib/fonts目錄中裝載任何字型。這意味着由平台(系統映像)提供必要的字型。

嵌入式Linux裝置上的視窗系統的平台插件

XCB

這是正常桌面Linux平台上使用的X11插件。在一些嵌入式環境中,它為Xcb提供了X和必要的開發檔案,這個插件就像在普通的PC桌面上一樣。

注意:在某些裝置上,由于EGL實作與Xlib不相容,是以在X下沒有EGL和OpenGL支援。在這種情況下,XCB插件是在沒有EGL支援的情況下建構的,這意味着QtQuick 2或其他基于OpenGL的應用程式不适用于此平台插件。然而,仍然可以使用它來運作軟體渲染的應用程式(例如基于QWidget)。

作為一般規則,XCB在嵌入式裝置上的使用是不可取的。像eglfs這樣的插件可能會提供更好的性能和硬體加速。

Wayland

Wayland是一個重量輕的開窗系統; 或者更準确地說,它是用于用戶端與顯示伺服器通信的協定。

Qt Wayland子產品提供了一個wayland平台插件,允許Qt應用程式連接配接到Wayland合成器。

注意:使用Weston參考合成器時,您可能會遇到觸摸屏輸入的問題。有關更多資訊,請參閱Qt Wiki。

Qt

繼續閱讀