青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

posts - 319, comments - 22, trackbacks - 0, articles - 11
  C++博客 :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理

Qt Lighthouse學習(二)

Posted on 2011-09-15 21:24 RTY 閱讀(914) 評論(0)  編輯 收藏 引用 所屬分類: Qt

上一次關注Qt Lighthouse是在6月初,可是現在都8月底了。時間真快...

Lighthouse 是 QPA(Qt Platform Abstraction) 項目的名字,它使得將Qt移植到新的平臺變得比較簡單。盡管現在它已經完全融入到了Qt主干代碼中,lighthouse作為獨立項目已經不復存在了,但本文中,我們繼續使用這個名字(雖然已不太恰當)。

QPA 抽象了什么?

不妨看看QPA前后,有何不同:

之前

考慮一下,傳統的Qt是如何實現圖形界面的夸平臺:

  • 針對不同的窗口系統(WS)定義相應的宏: Q_WS_*

Q_WS_X11
Q_WS_MAC
Q_WS_QWS
Q_WS_WIN
Q_WS_S60
  • 代碼中夾雜大量的編譯預處理指令 (處理小段)

#if defined(Q_WS_X11)
...
#elif defined(Q_WS_MAC)
...
#elif defined(Q_WS_WIN)
...
#endif
  • 各個窗口系統相關的代碼文件 (處理大段)

qapplication_x11.cpp
qapplication_win.cpp
qapplication_s60.cpp
qapplication_mac.mm
qapplication_qws.cpp
...
qwidget_win.cpp
qwidget_qws.cpp
qwidget_mac.cpp
qwidget_x11.cpp
...
  • src/gui/kernel.pri 等工程文件內,控制哪些文件參與編譯

win32 {
...
}
symbian {
...
}
unix:x11 {
...
}

這一切這意味這什么??

如果我們想在這個基礎上支持一個新的窗口系統,比如wayland,需要

  • 添加平臺相關的宏,代碼中針對該窗口再擴充 #if #elif #endif

  • 添加平臺相關的文件,擴充 **.pri 文件使其融入Qt
  • ...

總之,需要對Qt的代碼進行大量的修改。這一切使得將Qt移植到新的窗口系統中,變得不是那么容易。

之后

QPA 定義了一套接口,而后,將窗口系統相關的代碼放到插件中:

  • src/plugins/platforms/xlib/*
  • src/plugins/platforms/wayland/*
  • src/plugins/platforms/cocoa/*

這時,如果我們想支持一個新的窗口系統,怎么辦?只需要編寫一個新的插件,而Qt自身的代碼則不需要任何改變。

(當然,編寫插件本身還是很有難度的,哈...)

QPA源碼結構

為了使插件能供工作,Qt中需要提供有相應的加載接口,在Qt源碼中搜索*_qpa.h*_qpa.cpp *_qpa_p.h 即可找到所有(fixme)和 qpa有關的代碼:

  • QTDIR/src/opengl
    • qgl_qpa.cpp
  • QTDIR/src/gui
    • painting
      • qcolormap_qpa.cpp
      • qpaintdevice_qpa.cpp
    • image
      • qpixmap_qpa.cpp
    • egl
      • qegl_qpa.cpp
    • kernel
      • qplatformintegrationplugin_qpa.cpp
      • qplatformcursor_qpa.cpp
      • qwidget_qpa.cpp
      • ...
    • text
      • qfontengine_qpa.cpp
      • qfontengine_qpa_p.h
      • ...

可以看到代碼集中在 gui/kernel 部分;除此外,和字體相關gui/text,和繪圖相關gui/painting、gui/image、gui/egl,和opengl相關

QPA結構

QPlatformIntegration

這個應該算是 QPA 的核心了,

  • 它是QApplication(準確地說是QApplicationPrivate)的成員

class Q_GUI_EXPORT QApplicationPrivate : public QCoreApplicationPrivate
{
...
    static QPlatformIntegration *platform_integration;
...
  • 在初始化QAppliction時它會被創建

QApplication::QApplication()
  QApplicationPrivate::construct()
   qt_init()
     init_platform()
       QPlatfromIntegrationFactory::create()
  • 它是所有窗口系統相關函數的入口點

class Q_GUI_EXPORT QPlatformIntegration
{
public:

GraphicsSystem functions

virtual QPixmapData *createPixmapData()

virtual QPlatformWindow *createPlatformWindow()

virtual QWindowSurface *createWindowSurface()

Window System functions

virtual QList<QPlatformScreen *> screens()

virtual void moveToScreen()

virtual bool isVirtualDesktop()

virtual QPixmap grabWindow()

Deeper window system integrations

virtual QPlatformFontDatabase *fontDatabase()

virtual QPlatformClipboard *clipboard()

...

這樣一來:

當你在程序中

它會向QPlatformIntegration請求

使用QWidget時

給我一個窗口(QPlatformWindow)及繪圖區域(QWindowSurface)

使用QPixmap時

給我一個位圖的后端(QPixmapData)

使用QFont時

給我字體數據信息(QPlatformFontDatabase)

使用QGLWidget時

給我一個窗口

...

...

QPlatformWindow 與 QWindowSurface

QPlatformWindow

窗口
負責窗口的幾何尺寸
可以是另一個窗口的子窗口

QWindowSurface

窗口繪圖區域(drawing area of a window)
它來決定使用哪一個paintEngine
將像素Push到屏幕上

相對而言,QPlatformWindow 出現的比較晚一點(見Say hello to QPlatformWindow一文)之所以。之所以分離開來,原因見Remodelling the Lighthouse

QPlatformScreen

  • 代表屏幕(顯示器)
  • 它提供的api對應用程序來說是只讀的
  • 用來計算分辨率 dpi

class Q_GUI_EXPORT QPlatformScreen : public QObject
{
...
    virtual QRect geometry() const = 0;
    virtual QRect availableGeometry() const {return geometry();}
    virtual int depth() const = 0;
    virtual QImage::Format format() const = 0;
    virtual QSize physicalSize() const;

QPixmapData

為什么要有這個東西?

通常我們似乎都不怎么區分QImage和QPixmap,盡管在Manual中很大的篇幅在描述這二者的區別。

設計目的和用途(一個是IO和像素操作,一個是屏幕顯示):

  • QImage is designed and optimized for I/O, and for direct pixel access and manipulation
  • while QPixmap is designed and optimized for showing images on screen.

典型的用途:

  • Typically, the QImage class is used to load an image file, optionally manipulating the image data, before the QImage object is converted into a QPixmap to be shown on screen.
  • Alternatively, if no manipulation is desired, the image file can be loaded directly into a QPixmap.

與QImage不同,QPixmap 是平臺相關的

  • Note that the pixel data in a pixmap is internal and is managed by the underlying window system.

于是它的后端需要由各個窗口系統來提供也就不足為奇了。

QPlatformFontDatabase

提供字體信息

詳見Fonts in Lighthouse一文。

其他

  • QPlatformClipboard
  • QPlatformCursor
  • ...

同前面幾個一樣,從名字上容易看出是做什么的。

參考

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            看片网站欧美日韩| 亚洲欧美久久久久一区二区三区| 久久成人av少妇免费| 最新亚洲一区| 一区二区三区在线看| 国内精品久久久久久久影视蜜臀| 国产综合香蕉五月婷在线| 国产一区二区三区四区hd| 亚洲电影免费在线观看| 一区二区不卡在线视频 午夜欧美不卡在 | 欧美a级片网| 亚洲高清在线播放| 亚洲精品欧洲| 欧美在线精品免播放器视频| 玖玖玖国产精品| 欧美视频日韩视频在线观看| 国内精品视频在线播放| 亚洲日韩欧美视频一区| 欧美一区二区三区免费看| 久久亚洲私人国产精品va媚药 | 亚洲欧洲精品天堂一级| 亚洲欧美在线一区二区| 欧美激情第8页| 国产日韩欧美精品综合| 99精品欧美一区二区三区| 久久久久久久久岛国免费| 亚洲欧洲精品一区| 久久精品夜色噜噜亚洲a∨| 欧美视频日韩| 亚洲高清激情| 久久人人爽爽爽人久久久| 99精品免费| 欧美激情无毛| 亚洲二区在线视频| 久久久久久日产精品| 一区二区高清| 欧美日韩dvd在线观看| 91久久精品一区| 久久午夜电影网| 亚洲欧美偷拍卡通变态| 欧美精选午夜久久久乱码6080| 精品51国产黑色丝袜高跟鞋| 久久精品亚洲热| 午夜精品理论片| 国产精品一区二区久久| 亚洲一区二区三区乱码aⅴ蜜桃女| 亚洲国产高清高潮精品美女| 久久久久国产成人精品亚洲午夜| 国产麻豆日韩| 久久国产加勒比精品无码| 欧美视频中文在线看| 久久久久9999亚洲精品| 国产视频自拍一区| 香蕉久久夜色精品| 亚洲主播在线观看| 国产精品日韩欧美大师| 亚洲欧美日韩精品久久亚洲区| 亚洲人成在线免费观看| 欧美精品一区二区在线观看| 99re66热这里只有精品3直播| 亚洲国产福利在线| 欧美日本一区二区高清播放视频| 亚洲区一区二区三区| 亚洲第一久久影院| 欧美成人性网| 亚洲国产成人久久综合| 亚洲国产精品精华液网站| 欧美精品一区在线观看| 亚洲午夜免费视频| 午夜精品久久久久久久蜜桃app| 国外成人性视频| 亚洲高清视频一区二区| 欧美日韩八区| 久久av一区二区三区| 先锋资源久久| 很黄很黄激情成人| 亚洲国产经典视频| 国产精品av一区二区| 欧美一区激情视频在线观看| 久久视频精品在线| 亚洲天堂网在线观看| 亚洲午夜一级| 在线观看亚洲专区| 在线亚洲欧美专区二区| 黑人操亚洲美女惩罚| 亚洲国产精品99久久久久久久久| 欧美亚洲成人网| 久久久免费观看视频| 免费久久精品视频| 亚洲欧美日本另类| 免费美女久久99| 性一交一乱一区二区洋洋av| 久久久久国产精品麻豆ai换脸| 最近中文字幕mv在线一区二区三区四区 | 免费国产一区二区| 揄拍成人国产精品视频| 亚洲新中文字幕| 欧美一区二区视频97| 亚洲精品一区二区三区四区高清 | 久久深夜福利免费观看| 亚洲欧美精品在线观看| 久久久国产午夜精品| 99在线精品视频| 久久精品国产免费观看| 亚洲网站在线| 亚洲国产天堂久久国产91| 久久中文精品| 欧美精品在线视频| 麻豆成人综合网| 国产精品每日更新| 亚洲电影免费在线| 国内久久婷婷综合| 亚洲午夜小视频| 9色精品在线| 欧美freesex交免费视频| 久久久久成人精品免费播放动漫| 欧美久久成人| 亚洲高清在线观看| 伊人久久大香线蕉综合热线| 亚洲欧美激情诱惑| 亚洲一区二区三区视频播放| 欧美激情国产日韩| 欧美成ee人免费视频| 国内久久婷婷综合| 先锋影音一区二区三区| 西西裸体人体做爰大胆久久久| 欧美精选一区| 亚洲精品自在在线观看| 亚洲伦理中文字幕| 欧美不卡在线视频| 欧美ab在线视频| 亚洲国产精品电影在线观看| 久久久久一区二区三区| 老鸭窝毛片一区二区三区| 国外视频精品毛片| 久久精品免费播放| 免费成人黄色片| 91久久精品美女| 欧美ab在线视频| 亚洲欧洲三级电影| 日韩一区二区电影网| 欧美日韩精品免费| 99视频国产精品免费观看| 午夜精品久久久久久久99樱桃| 国产精品亚洲人在线观看| 午夜亚洲福利在线老司机| 久久精品国产综合精品| 影视先锋久久| 欧美成人首页| 一区二区三区四区五区视频 | 亚洲性图久久| 国产精品日韩专区| 欧美中文字幕不卡| 欧美二区在线看| 99精品久久久| 国产精自产拍久久久久久蜜| 欧美一区二区精品在线| 欧美成人一区二区三区在线观看| 亚洲精品欧美| 国产精品嫩草影院av蜜臀| 欧美在线一级va免费观看| 欧美国产日本| 亚洲欧美日韩在线不卡| 海角社区69精品视频| 欧美精品一区二区三区蜜臀| 亚洲一区国产一区| 欧美暴力喷水在线| 亚洲欧美视频在线| 91久久在线播放| 国产精品亚洲网站| 欧美国产视频一区二区| 午夜精品一区二区三区在线 | 亚洲片国产一区一级在线观看| 久久综合五月| 久久gogo国模裸体人体| 亚洲欧洲在线免费| 最新精品在线| 国产精品伊人日日| 亚洲动漫精品| 国产欧美一区二区精品婷婷| 久久久亚洲高清| 欧美劲爆第一页| 久久综合久久综合久久| 欧美日韩国产三区| 欧美成人精品激情在线观看| 国产精品中文字幕欧美| 中文日韩电影网站| 一区二区三区日韩| 久久综合伊人77777麻豆| 久久精品亚洲国产奇米99| 国产精品白丝av嫩草影院 | 亚洲缚视频在线观看| 亚洲午夜激情网站| 亚洲一区二区三区影院| 欧美阿v一级看视频| 亚洲人成网在线播放| 亚洲欧洲日本专区| 欧美精品一区三区| 亚洲欧美日韩国产综合| 欧美在线免费一级片|