1. 程式人生 > >Qt介紹1---QPA(Qt Platform Abstraction)

Qt介紹1---QPA(Qt Platform Abstraction)

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。