qt笔记之main.cpp加载qml文件的3种方法QQuickView 、QQmlApplicationEngine、QQuickWidget

qt笔记之main.cpp加载qml文件的3种方法QQuickView 、QQmlApplicationEngine、QQuickWidget

—— 2024-06-16 下午

code review!

文章目录

  • qt笔记之main.cpp加载qml文件的3种方法QQuickView 、QQmlApplicationEngine、QQuickWidget
    • 1.使用qtcreator创建qml空项目,默认使用QQmlApplicationEngine
      • 1.1.main.cpp
      • 1.2.qml
      • 1.3.qml_test.pro
      • 1.4.qml.qrc
    • 2.`QQuickView` 和 `QQmlApplicationEngine`对比
      • 使用 `QQuickView`
      • 使用 `QQmlApplicationEngine`
      • 对比与选择
    • 3.`QQuickView` 和 `QQmlApplicationEngine`进一步对比
      • 使用 `QQuickView` 加载 QML 文件
      • 使用 `QQmlApplicationEngine` 加载 QML 文件
      • 结论
    • 4.QQuickView 、QQmlApplicationEngine、QQuickWidget对比表格
      • 总结

时序和新旧顺序

  • Qt 5.0 引入 QQuickView
  • Qt 5.1 引入 QQmlApplicationEngine
  • Qt 5.3 引入 QQuickWidget

1.使用qtcreator创建qml空项目,默认使用QQmlApplicationEngine

创建项目后的出现的文件列表

user@user-vm:~/qt_cpp_test/qml_test$ ls
main.cpp  main.qml  qml.qrc  qml_test.pro

1.1.main.cpp

#include <QGuiApplication>
#include <QQmlApplicationEngine>

int main(int argc, char *argv[])
{
    QCoreApplication::setAttribute(Qt::AA_EnableHighDpiScaling);

    QGuiApplication app(argc, argv);

    QQmlApplicationEngine engine;
    const QUrl url(QStringLiteral("qrc:/main.qml"));
    QObject::connect(&engine, &QQmlApplicationEngine::objectCreated,
                     &app, [url](QObject *obj, const QUrl &objUrl) {
        if (!obj && url == objUrl)
            QCoreApplication::exit(-1);
    }, Qt::QueuedConnection);
    engine.load(url);

    return app.exec();
}

1.2.qml

import QtQuick 2.12
import QtQuick.Window 2.12

Window {
    visible: true
    width: 640
    height: 480
    title: qsTr("Hello World")
}

1.3.qml_test.pro

QT += quick

CONFIG += c++11

# The following define makes your compiler emit warnings if you use
# any Qt feature that has been marked deprecated (the exact warnings
# depend on your compiler). Refer to the documentation for the
# deprecated API to know how to port your code away from it.
DEFINES += QT_DEPRECATED_WARNINGS

# You can also make your code fail to compile if it uses deprecated APIs.
# In order to do so, uncomment the following line.
# You can also select to disable deprecated APIs only up to a certain version of Qt.
#DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x060000    # disables all the APIs deprecated before Qt 6.0.0

SOURCES += \
        main.cpp

RESOURCES += qml.qrc

# Additional import path used to resolve QML modules in Qt Creator's code model
QML_IMPORT_PATH =

# Additional import path used to resolve QML modules just for Qt Quick Designer
QML_DESIGNER_IMPORT_PATH =

# Default rules for deployment.
qnx: target.path = /tmp/$${TARGET}/bin
else: unix:!android: target.path = /opt/$${TARGET}/bin
!isEmpty(target.path): INSTALLS += target

1.4.qml.qrc

<RCC>
    <qresource prefix="/">
        <file>main.qml</file>
    </qresource>
</RCC>

2.QQuickViewQQmlApplicationEngine对比

在使用 Qt Creator 创建一个空的 QML 程序时,可以选择使用 QQuickViewQQmlApplicationEngine 来加载和显示 QML 文件。在 Qt Creator 中创建一个新的 Qt Quick 应用程序时,默认情况下并不会提供选项让选择使用 QQuickView 或 QQmlApplicationEngine。通常,创建的模板会使用 QQmlApplicationEngine,因为它是一个更通用和灵活的类,适用于大多数应用场景。

使用 QQuickView

QQuickView 是一个 QWindow 子类,用于创建一个独立窗口来显示 QML 内容。它更适用于纯 QML 应用程序或者需要单独窗口显示 QML 内容的应用。

QQuickView: 如果的应用程序主要使用 QML,或者需要一个独立窗口来显示 QML 内容,那么 QQuickView 更加适合。

  • 当使用 QQuickView 时,确保没有无意中创建第二个窗口。例如,不要在 QML 文件中再创建一个 Window 或 ApplicationWindow,因为 QQuickView 本身已经是一个窗口。
  • 如果在 QML 文件中使用 Window 或 ApplicationWindow,则会导致 QQuickView 运行时弹出两个窗口。因此,使用 QQuickView 时,应避免在 QML 文件中使用 Window 或 ApplicationWindow。

使用 QQmlApplicationEngine

QQmlApplicationEngine 是一个更加灵活的类,可用于加载和管理 QML 组件,并且可以结合 C++ 对象进行更复杂的逻辑处理。下面是一个使用 QQmlApplicationEngine 来加载 QML 文件的示例程序:

  • 当使用 QQmlApplicationEngine 时,QML 文件应该包含一个顶层窗口组件,例如 Window 或 ApplicationWindow,才能正确显示窗口。

对比与选择

  • QQuickView: 适用于需要创建一个独立窗口来显示 QML 内容的简单应用程序。它提供了一个简洁的方法来加载和显示 QML 文件。
  • QQmlApplicationEngine: 提供了更灵活的功能,适用于需要加载多个 QML 文件或需要更复杂的 C++ 与 QML 交互的应用程序。

通常,对于简单的 QML 应用程序,可以使用 QQuickView。对于复杂的项目,尤其是需要与 C++ 代码进行较多交互的项目,推荐使用 QQmlApplicationEngine

3.QQuickViewQQmlApplicationEngine进一步对比

以下是 QQuickViewQQmlApplicationEngine 的对比表格,特别关注它们在加载 QML 文件时的行为,以及是否会导致弹出两个窗口的情况。
在这里插入图片描述

在这里插入图片描述

特性QQuickViewQQmlApplicationEngine
主要用途用于显示单个 QML 文件的视图组件用于管理和加载整个 QML 应用程序
加载 QML 文件view.setSource(QUrl("qrc:/main.qml"))engine.load(QUrl("qrc:/main.qml"))
顶层组件不需要 WindowApplicationWindow需要 WindowApplicationWindow
是否会弹出两个窗口如果 QML 文件中包含 WindowApplicationWindow,则会弹出两个窗口正常情况下不会弹出两个窗口,除非有多个顶层组件
配置窗口属性通过 QQuickView 的方法直接配置通过 QML 文件中的 WindowApplicationWindow 配置
示例代码加载 QML[见下文示例代码][见下文示例代码]
适用场景简单的 QML 界面显示全功能的 QML 应用程序

使用 QQuickView 加载 QML 文件

C++ 代码:

#include <QGuiApplication>
#include <QQuickView>

int main(int argc, char *argv[]) {
    QGuiApplication app(argc, argv);

    QQuickView view;
    view.setSource(QUrl(QStringLiteral("qrc:/main.qml")));
    view.setResizeMode(QQuickView::SizeRootObjectToView);
    view.show();

    return app.exec();
}

QML 文件(main.qml):

import QtQuick 2.0

Rectangle {
    width: 640
    height: 480
    color: "lightblue"

    Text {
        text: "Hello, World!"
        anchors.centerIn: parent
    }
}

注意: 当使用 QQuickView 时,不要在 QML 文件中使用 WindowApplicationWindow 组件,否则会弹出两个窗口。

使用 QQmlApplicationEngine 加载 QML 文件

C++ 代码:

#include <QGuiApplication>
#include <QQmlApplicationEngine>

int main(int argc, char *argv[]) {
    QGuiApplication app(argc, argv);

    QQmlApplicationEngine engine;
    engine.load(QUrl(QStringLiteral("qrc:/main.qml")));

    if (engine.rootObjects().isEmpty())
        return -1;

    return app.exec();
}

QML 文件(main.qml):

import QtQuick 2.0
import QtQuick.Window 1.0

Window {
    visible: true
    width: 640
    height: 480
    color: "lightblue"

    Text {
        text: "Hello, World!"
        anchors.centerIn: parent
    }
}

注意: 当使用 QQmlApplicationEngine 时,必须在 QML 文件中包含一个 WindowApplicationWindow 组件,否则即使加载成功也不会弹出窗口。

结论

  • QQuickView:适用于简单的单视图应用,确保 QML 文件没有 WindowApplicationWindow 组件,以避免弹出两个窗口。
  • QQmlApplicationEngine:适用于更复杂的 QML 应用,需要在 QML 文件中包含 WindowApplicationWindow 组件,确保正常显示窗口。

4.QQuickView 、QQmlApplicationEngine、QQuickWidget对比表格

特性QQuickViewQQmlApplicationEngineQQuickWidget
类型QWindow 子类无窗口类,管理 QML 组件QWidget 子类
使用场景独立窗口显示 QML 内容复杂应用,加载多个 QML 文件,C++ 与 QML 交互传统 QWidget 应用中嵌入 QML 内容
布局支持不支持 QWidget 布局管理器不适用支持 QWidget 布局管理器
OpenGL 支持使用 OpenGL 渲染使用 OpenGL 渲染默认使用 OpenGL 渲染(可禁用)
混合界面适合纯 QML 应用或需要独立窗口的场景适合复杂的 QML 应用和 C++ 交互适合在现有 QWidget 应用中嵌入 QML 内容
加载 QML 文件通过 setSource 方法通过 load 方法通过 setSource 方法
性能较高性能,直接渲染到窗口较高性能,直接管理 QML 组件相对较低,需处理 QWidget 和 QML 之间的转换
错误处理基本的错误处理提供更详细的错误处理机制基本的错误处理
渲染控制完全控制 QML 内容的渲染完全控制 QML 内容的渲染需要处理 QWidget 和 QML 的渲染同步问题
跨平台支持
便捷性简单易用,快速原型开发灵活,适合复杂应用便于在现有 QWidget 应用中集成 QML
C++ 与 QML 交互支持,但不如 QQmlApplicationEngine 灵活支持更复杂和灵活的交互支持,但需要处理 QWidget 和 QML 的交互问题
窗口管理独立窗口无窗口管理嵌入到现有 QWidget 界面中
适用项目类型小型到中型项目,独立的 QML 应用中型到大型项目,复杂的 QML 和 C++ 应用需要在现有的 QWidget 应用中嵌入 QML 的项目

总结

  • QQuickView:

    • 适用于需要创建独立窗口来显示 QML 内容的应用。
    • 提供简单的接口和较高的性能,适合纯 QML 应用或需要快速原型开发的场景。
  • QQmlApplicationEngine:

    • 适用于复杂应用,尤其是需要加载多个 QML 文件和处理复杂 C++ 与 QML 交互的场景。
    • 提供更详细的错误处理机制和灵活性,适合中型到大型项目。
  • QQuickWidget:

    • 适用于需要在现有 QWidget 应用中嵌入 QML 内容的场景。
    • 支持 QWidget 布局管理器,但在性能上可能稍逊,需要处理 QWidget 和 QML 之间的渲染同步问题。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/728093.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【python】Sklearn—Cluster

参考学习来自 10种聚类算法的完整python操作示例 文章目录 聚类数据集亲和力传播——AffinityPropagation聚合聚类——AgglomerationClusteringBIRCH——Birch&#xff08;✔&#xff09;DBSCAN——DBSCANK均值——KMeansMini-Batch K-均值——MiniBatchKMeans均值漂移聚类——…

来都来了,8个JavaScript技巧奉上

吆喝一声&#xff0c;如果你计算机、软件工程、电子等相关专业本科及以上学历&#xff0c;欢迎来共事。前后端/测试可投&#xff0c;技术大厂。 JavaScript 作为最流行的语言之一&#xff0c;其语法灵活且每年都在不断吸纳新特性&#xff0c;即使是一个从业多年的老手&#xff…

Hydra常用爆破命令

常用破解命令 SSH 破解 hydra -l 用户名 -p 密码字典 -t 线程 -vV -e ns ip ssh hydra -l 用户名 -p 密码字典 -t 线程 -o save.log -vV ip sshFTP 破解 hydra ftp://ip -l 用户名 -P 密码字典 -t 线程(默认16) -vV hydra ftp://ip -l 用户名 -P 密码字典 -e ns -vVWeb 登陆…

《深入理解Spark RDD缓存机制》(第4天)

文章目录 前言一、小试牛刀&#xff1a;解剖RDD缓存机制&#xff1f;1. 什么是Spark RDD缓存策略1.1 为什幺RDD要做缓存1.2 缓存相关API&#xff1a;1.3 缓存案例解析:1.4 图解缓存效果: 2. 什么是checkpoint缓存2.1 为什么要做checkpoint缓存2.2 checkpoint相关API:2.3 checkp…

爬取CSDN博文到本地(包含图片,标签等信息)

文章目录 csdnToMD改进将CSDN文章转化为Markdown文档那有什么办法快速得到md文档&#xff1f;例如&#xff1a;获取单个文章markdown获取所有的文章markdown 项目中待解决的问题 csdnToMD 项目原作者&#xff1a;https://gitee.com/liushili888/csdn-is—mark-down 改进后仓库…

Linux-账号和权限管理

目录 一、管理用户账号 1、用户账号类型 2、UID--身份标识 3、UID的分类 ​4、用户账号文件​ 5、chage-修改账号密码 5.1、chage—使用格式&#xff1a; 5.2、chage—使用参数&#xff1a; ​6、添加用户账号与管理 6.1、useradd—添加用户 6.2、passwd—设置/修改…

(创新)基于VMD-CNN-BiLSTM的电力负荷预测—代码+数据

目录 一、主要内容&#xff1a; 二、运行效果&#xff1a; 三、VMD-BiLSTM负荷预测理论&#xff1a; 四、代码数据下载&#xff1a; 一、主要内容&#xff1a; 本代码结合变分模态分解( Variational Mode Decomposition&#xff0c;VMD) 和卷积神经网络(Convolutional neu…

【0基础学爬虫】爬虫基础之自动化工具 Appium 的使用

大数据时代&#xff0c;各行各业对数据采集的需求日益增多&#xff0c;网络爬虫的运用也更为广泛&#xff0c;越来越多的人开始学习网络爬虫这项技术&#xff0c;K哥爬虫此前已经推出不少爬虫进阶、逆向相关文章&#xff0c;为实现从易到难全方位覆盖&#xff0c;特设【0基础学…

目标检测——SCUT-HEAD:大规模人头检测数据集的深度剖析

引言 亲爱的读者们&#xff0c;您是否在寻找某个特定的数据集&#xff0c;用于研究或项目实践&#xff1f;欢迎您在评论区留言&#xff0c;或者通过公众号私信告诉我&#xff0c;您想要的数据集的类型主题。小编会竭尽全力为您寻找&#xff0c;并在找到后第一时间与您分享。 在…

Python学习打卡:day11

day11 笔记来源于&#xff1a;黑马程序员python教程&#xff0c;8天python从入门到精通&#xff0c;学python看这套就够了 目录 day1183、自定义 Python 包创建包导入包方式1方式2方式3方式4 84、安装第三方包安装第三方包——pippip的网络优化 安装第三方包——PyCharm 85、…

小林图解系统-三、操作系统结构

Linux 内核 vs Windows 内核 内核 作为应用连接硬件设备的桥梁&#xff0c;保证应用程序只需要关心与内核交互&#xff0c;不需要关心硬件的细节 内核具备四个基本能力&#xff1a; 管理进程、线程&#xff0c;决定哪个进程、线程使用CPU&#xff0c;也就是进程调度的能力&a…

openh264 帧级码率控制原理:RcCalculateIdrQp 函数

RcCalculateIdrQp函数 功能 在码控中&#xff0c;当eSliceType为I_SLICE时 计算 IDR 帧的帧级量化参数QP 值。 原理过程 初始化变量&#xff1a; dBpp&#xff1a;初始化为0&#xff0c;用来存储比特率每像素&#xff08;bits per pixel&#xff09;的值。i&#xff1a;一个…

nginx的正向代理

目录 1 正向代理 1.1 使用正向代理的作用 1.2 Nginx正向代理实战 1.2.1 下载对应版本的nginx&#xff08;源码编译&#xff09; 1.2.2 下载 https 代理模块 1.2.3 使用https代理模块对源代码修改 1.2.4 源码安装 1.2.5 编写systemd 服务单元 1.2.6 修改nginx的主配置文件 1.2.…

虚拟现实环境下的远程教育和智能评估系统(十一)

视频帧画面知识点区域划分 知识点区域精确分割技术: 在深度学习检测模型结果基础上使用基于交并比&#xff08;IoU&#xff09;阈值的目标合并算法&#xff0c;合并过度重合目标区域面积&#xff0c;实现知识点区域精确分割 多模态知识点内容匹配策略: 图像&#xff1a;利用…

【人工智能,机器学习,统计学习,科学表征】开源商用与研发合作

个体工户linjing-lab托管在Github&#xff0c;现公开招募商用与合作人员&#xff0c;目标人群分为以下几个方向&#xff1a; 数学、信息科学、计算机专业的大学高年级学生&#xff0c;熟悉C和面向对象模型&#xff0c;擅长Pybind11编译算子到Python环境。26岁以下的大学本科毕…

PDF文档翻译软件哪个好?分享5款快速翻译的工具

世界各地的交流日益密切&#xff0c;文档翻译服务因此变得不可或缺。 无论是企业间的跨国商务合同&#xff0c;还是学术领域的专业研究论文&#xff0c;准确无误地将文档内容翻译成目标语言&#xff0c;对于保障信息的清晰传达和正确理解极为关键。 在这样的背景下&#xff0…

今日分享:中国石油年金系统交互、视觉设计和vue开发

金融系统交互及UI设计时&#xff0c;需注意简洁明了、色彩合理、字体统一、交互易用、安全感和用户控制。确保用户快速理解、安全操作并提升体验。

JavaScript:at()方法遇到的问题并解决

目录 第一章 前言 第二章 使用at方法 第三章 分析原因并解决问题 第一章 前言 最近上线了一个项目&#xff0c;测试过程中并没有什么问题&#xff0c;但是上线后使用的用户多了&#xff0c;结果出现了这么一个问题&#xff1a;.at方法对低版本手机的浏览器不兼容问题&#x…

英伟达中国特供芯片降价背后:巨头与市场的较量

英伟达&#xff0c;这家曾经在人工智能芯片领域独领风骚的巨头&#xff0c;近期在中国市场遭遇了一些挑战。为了应对来自华为等中国本土企业的竞争&#xff0c;英伟达不得不采取降价策略&#xff0c;调整其专为中国市场打造的H20芯片价格&#xff0c;甚至低于华为的同类产品。这…

STM32 串口通讯

使用STM32的串口通讯&#xff0c;接收串口助手的数据&#xff0c;并且将接收到的数据返回串口&#xff0c;重定义printf功能。 配置引脚信息 由于每次新建工程都需要配置信息&#xff0c;比较麻烦&#xff0c;好在STM32CubeIDE提供了导入.ioc文件的功能&#xff0c;可以帮我们…