QQuick-自绘

QQuick提供了丰富的控件,搭配qml很容易就可以搭配出一套丝滑的UI界面。但是在有些场景下无论是出于效率还是现有控件的局限都需要进行自绘才能实现自身的需求。QQuick支持多种自绘:

可以使用的方案:

1. 继承QQuickPaintedItem ,重写 paint 函数

优点: 这个是最容易实现的方式,也非常贴合QWidget那一套方案,QPainter自绘的接口也是一样的,无学习成本。底层会根据操作转换为对应的OpenGL渲染。即不需要学习OpenGL的api也能享受到OpenGL用GPU渲染的好处

代价: renderTarget==QQuickPaintedItem::Image 在这个模式下,会有一层纹理数据的copy,性能上会有损失

2. 继承QQuickFrameBufferObject,重写 createRenderer 函数

createRenderer函数需要返回一个QQuickFramebufferObject::Renderer对象,自绘操作是在QQuickFramebufferObject::Renderer::render操作中进行的,这里面可以用OpenGL进行绘制操作

优点: 性能好,直接用OpenGL绘制,省去了纹理的copy操作

代价: 需要学习OpenGL相关知识

3. 继承QQuickItem,重写 updatePaintNode 

这种方法更直接,因为QQuick所有的可视元素都是继承QQuickItem,渲染的根本就是每一次update时调用每一个可视QQuickItem的updatePaintNode收集要渲染的内容,上面两种方式其实就是QQuick框架在内部定义好了 updatePaintNode 逻辑

优点: 性能好,省去了中间的其他转换逻辑,内部可以根据当前框架所使用的渲染方式(OpenGL、D3D\Metal(MAC)\Soft),来决定使用哪一套绘制方案。

代价: 需要学习更多关于本地绘制的api使用方法(OpenGL/D3D/Metal/Soft)


                
03-15
### QQuick in Qt Framework #### 什么是 QQuick? `QQuick` 是 Qt 框架中的一个重要组成部分,主要与 `Qt Quick` 和 `QML` 技术密切相关。它是一个基于 C++ 的模块,提供了实现 Qt Quick 功能的核心类和支持工具[^3]。 #### QQuick 的核心功能 `QQuick` 提供了一系列的 API 来支持开发人员构建高性能、动态交互式的用户界面。这些接口允许开发者通过 C++ 实现自定义的功能逻辑并与 QML 文件无缝集成。以下是其一些关键特性: - **QQuickItem 类** 这是所有可视项目的基类,在 QML 中表示为 `Item`。所有的可视化组件都继承自该类,从而实现了统一的操作方式和属性管理机制[^2]。 - **场景图渲染架构** 使用高效的图形渲染引擎来优化性能表现,特别是针对移动设备上的应用开发尤为重要[^1]。 - **事件处理系统** 支持鼠标点击、触摸滑动等多种输入源的时间捕获与分发流程控制。 #### 如何在项目中启用 QQuick? 为了能够正常使用到上述提到的各种能力,通常需要完成以下几个方面的配置工作: 1. 在 `.pro` 文件里添加必要的依赖项声明; ```makefile QT += quick widgets charts ``` 2. 修改默认的应用程序入口函数模板,默认情况下新建工程向导会生成使用 `QGuiApplication` 的版本,但如果计划引入图表控件,则需替换为传统的 `QApplication` 形式。 3. 导入对应的命名空间以便访问内部成员变量或者方法调用; ```cpp using namespace QtCharts; ``` 4. 编写具体的业务逻辑代码片段并将其注册至运行环境当中去执行。 ```cpp #include <QQmlApplicationEngine> #include <QApplication> int main(int argc, char *argv[]) { QApplication app(argc, argv); QQmlApplicationEngine engine; const QString qmlFile = QStringLiteral("qrc:/main.qml"); QObject::connect(&engine, &QQmlApplicationEngine::objectCreated, [&app](QObject* obj, const QUrl& url){ if (!obj && url == qmlFile) QCoreApplication::exit(-1); }, Qt::QueuedConnection); engine.load(qmlFile); return app.exec(); } ```
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值