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。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM