Qt是一個誇平台的庫(一直宣稱“Qt everywhere”),但是Qt底層不是誇平台的。比如:Qt中Gui部件的核心類QWidget,該類除了qwidget.h 和 qwidget.cpp兩個原文件外,還有
kernel/qwidget_mac.mm
kernel/qwidget_qws.cpp
kernel/qwidget_win.cpp
kernel/qwidget_s60.cpp
kernel/qwidget_x11.cpp
kernel/qwidget_wince.cpp
…
在源代碼中,
#if defined(Q_WS_X11) ... #elif defined(Q_WS_MAC) ... #elif defined(Q_WS_WIN) ... #endif
而這一切都使得將 Qt 移植到一個新的窗口系統變的不太容易。但是QPA出現了,官方文檔的解釋為:
Lighthouse is the project name for the Qt Platform Abstraction – making it much easier to port Qt to new platforms.
Lighthouse是Qt Platform Abstraction項目的名字,它使得將Qt移植到新的平台變得比容易。
QPA(Qt Platform Abstraction)介紹
From the Qt Project wiki :
“QPA is the platform abstraction layer for Qt 5 and replaces QWS and the platform ports from Qt 4.”QPA (Qt Platform Abstraction) 即Qt使用QWS,Qt5使用QPA。
Qt4的程序在嵌入式Linux運行時,需要加入參數“-qws”啟動Qt窗口系統服務,如“./app -qws”運行app程序。從Qt5.0開始,Qt自身不再單獨實現窗口系統,QWS不復存在,取而代之的新機制是QPA(Qt平台抽象),QPA使得Qt對不同平台的支持變得更加靈活,當需要支持一個新平台時,只需為該平台編寫一個QPA插件。
QPA的相關代碼在qtbase/src/gui/kernel/qplatform*
其插件在qtbase/src/plugins/platforms/
Qt5運行時需要通過“-platform”來制定QPA插件,如果不指定就默認使用QPA插件,在QT_QPA_PLATFORM變量制定,比如:
./app -platform eglfs
./app -platform linuxfb
QWS(Qt Window System)介紹
QWS(Qt Windows System)是QT自行開發的窗口系統,體系結構類似X Windows,是一個C/S結構,由QWS Server在物理設備上顯示,由QWS Client實現界面,兩者通過socket進行彼此的通訊。在很多嵌入式系統里,QT程序基本上都是用QWS來實現,這樣保證程序的可移植性。
另外在運行QT程序時添加-qws參數,表示這個程序時QWS Server,否則是QWS Client。任何一個基於QT的application都可以做QWS Server。當然QWS Server一定先於QWS Client啟動,否則QWS Client將啟動失敗。在實際應用中一般會指定某個特殊的application做QWS Server,這個application一般還會管理一些其它的系統資源。
QWS Server管理機制:QWS Server是一個server socket,QWS Client是一個client socket。QWS Client啟動時會主動向QWS Server的server socket建立連接。而后就QWS Server通過這個socket傳遞QWS Command和QWS Event來管理QWS Client。