上一次关注Qt
Lighthouse是在6月初,可是现在都8月底了。时间真快...
Lighthouse 是 QPA(Qt Platform Abstraction) 项目的名字,它使得将Qt移植到新的平台变得比较简单。尽管现在它已经完全融入到了Qt主干代码中,lighthouse作为独立项目已经不复存在了,但本文中,我们继续使用这个名字(虽然已不太恰当)。
QPA 抽象了什么?
不妨看看QPA前后,有何不同:
之前
考虑一下,传统的Qt是如何实现图形界面的夸平台:
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,需要
总之,需要对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
- QTDIR/src/gui
- painting
- qcolormap_qpa.cpp
- qpaintdevice_qpa.cpp
- image
- egl
- 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;
...
QApplication::QApplication()
QApplicationPrivate::construct()
qt_init()
init_platform()
QPlatfromIntegrationFactory::create()
class Q_GUI_EXPORT QPlatformIntegration
{
public:
GraphicsSystem functions
|
|
virtualQPixmapData*createPixmapData()
|
|
virtualQPlatformWindow*createPlatformWindow()
|
|
virtualQWindowSurface*createWindowSurface()
|
Window System functions
|
|
virtualQList<QPlatformScreen*>screens()
|
|
virtualvoidmoveToScreen()
|
|
virtualboolisVirtualDesktop()
|
|
virtualQPixmapgrabWindow()
|
Deeper window system integrations
|
|
virtualQPlatformFontDatabase*fontDatabase()
|
|
virtualQPlatformClipboard*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
- ...
同前面几个一样,从名字上容易看出是做什么的。
参考
俄
分享到:
相关推荐
Laravel开发-lighthouse Lighthouse是一个用于Laravel应用程序的模式第一个graphql包。
Lighthouse的一个Webpack插件
Wordpress Lighthouse模板
WEF_Global_Lighthouse_Network.pdf
Lighthouse Tracking System-ALG(中文版)
Lighthouse_Tracking_System_Hypereal(中文版)
python库。 资源全名:lighthouse-0.11.1.tar.gz
资源来自pypi官网。 资源全名:lighthouse-0.9.0.tar.gz
Lighthouse 谷歌插件 Google Chrome要求版本为 52 或更高版本。
lighthouse-ci, 在使用 Docker的CI中,运行 Lighthouse 灯塔 CI这个 repo 包含灯塔CI服务器的前端和后端。审计GitHub请求请求请注意:这个服务的下降是考虑英镑。 没有sla或者正常运行时间保证。 如果对运行自己的CI...
Lighthouse是一个PHP包,允许您从Laravel应用程序提供GraphQL端点。 它大大减少了创建模式所需的样板,它可以很好地与任何Laravel项目集成,并且可以高度自定义,让您可以完全控制数据。
使用Google的 lighthouse 从URL列表构建一组报告
使用Docker在CI中运行Lighthouse
基于chrome的扩展,可以自动生成web优化方案 https://github.com/GoogleChrome/lighthouse/ https://developers.google.com/web/tools/lighthouse/
用法安装您可能必须在项目中将testcafe-lighthouse库添加为依赖项(或dev-dependency)$ yarn add -D testcafe-lighthouse# or$ npm install --save-dev testcafe-lighthouse在你的代码中安装完成后,您可以在代码中...
实时光线追踪的Lighthouse 2框架 这是Lighthouse 2的公共仓库,它是用于实时光线跟踪/路径跟踪实验的渲染框架。 Lighthouse 2使用最先进的波前/流线跟踪实现,以在RTX硬件(使用Optix 7.2)和RTX之前的硬件(使用...
@foo-software/lighthouse-persist 持久保存Lighthouse审计结果以进行网站监视和分析的工具。 性能,SEO,渐进式Web应用程序,最佳实践在结果对象中公开,并包含在HTML报告中。 将报告保存在本地或上传到您的AWS S3...
luna-hp-lighthouse:仅用于托管Lighthouse
资源分类:Python库 所属语言:Python 资源全名:tencentcloud-sdk-python-lighthouse-3.0.425.tar.gz 资源来源:官方 安装方法:https://lanzao.blog.csdn.net/article/details/101784059