QPA(Qt Platform Abstraction)介紹 --------QWS(Qt Window System)介紹

 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。
 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章