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

news2024/12/24 21:02:45

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 之间的渲染同步问题。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

手把手教你如何在Windows11下安装Docker容器

文章的主要要点&#xff1a; 为什么使用Docker&#xff1a;Docker可以简化部署过程&#xff0c;特别适合新手或在学习新技能&#xff08;如Redis、MySQL、消息队列、Nginx等&#xff09;时使用。 安装前的准备&#xff1a;在安装Docker之前&#xff0c;需要在Windows中开启一些…

ModuleNotFoundError: No module named ‘distutils‘的解决办法

最近想试试odoo17&#xff0c;在windows环境下&#xff0c;想安装试验一下&#xff0c;结果老出现oduleNotFoundError: No module named ‘distutils‘错误。查了一下&#xff0c;以为是python版本导致的&#xff0c;结果试了很多版本如下&#xff1a; 试了几个&#xff0c;每个…

HLS入门实验

文章目录 一、HLS介绍1.1 什么是HLS1.2HLS与VHDL/Verilog编程技术有什么关系?1.3HLS的关键技术和技术局限性1.3.1关键技术1.3.2 技术局限性 二、HLS入门实验2.1安装Vivado2.2创建项目2.3添加文件2.4仿真2.5创建Vivado工程2.6生成IP核2.7添加代码 参考 一、HLS介绍 1.1 什么是…

【C语言】解决C语言报错:Race Condition

文章目录 简介什么是Race ConditionRace Condition的常见原因如何检测和调试Race Condition解决Race Condition的最佳实践详细实例解析示例1&#xff1a;缺乏适当的同步机制示例2&#xff1a;错误使用条件变量 进一步阅读和参考资料总结 简介 Race Condition&#xff08;竞争条…

计算缺失msvcr120.dll文件怎么办,msvcr120.dll丢失的解决方法分享

在计算机使用过程中&#xff0c;我们经常会遇到一些错误提示&#xff0c;其中之一就是“找不到msvcr120.dll”。那么&#xff0c;msvcr120.dll到底是什么&#xff1f;为什么计算机会找不到它&#xff1f;它会对计算机产生什么具体影响&#xff1f;如何解决这个问题&#xff1f;…

证照之星 XE版软件怎么下载安装? 【详细安装图文教程】

软件简介&#xff1a; 证照之星是国内顶级的证件照片制作软件&#xff0c;具有一键裁剪&#xff0c; 智能背景替换&#xff0c;批量制作、内置证照规格的四大优势。同时两大独创技术&#xff1a;智能去除皮肤油光、证照服装替换。同时支持联机拍摄&#xff1a;支持网络摄像头及…

linux中批量给文件改名

rename 需要批量将文件名前的UC-10_取消掉&#xff0c;以数字来命名文件 rename s/UC-10_// *.jpg 修改成功 要是修改为其他名字需要在单引号的第二个/后加字符即可 例如要改为li

一段代码读取Chrome存储的所有账号密码和Cookie

先写结论&#xff1a; Chrome密码管理里的账号密码&#xff0c;还有Cookie&#xff0c;安全性并不算太高&#xff0c;一段代码就可以自动读取并上报到其它地方。 尤其是国内用户大多喜欢破解软件&#xff0c;这些软件只要注入这样一段代码&#xff0c;就无声无息的把你的所有账…

74HC04做陶瓷和晶体振荡器实验初步

面包板&#xff0c;电压5V 17.6Mhz晶振&#xff0c;起振OK 其他的465K&#xff0c;1M&#xff0c;4M&#xff0c;10M&#xff0c;16M&#xff0c;20M陶瓷不起振 更换过Rf也不起作用&#xff0c;待研究。 rf参考&#xff0c;这是人家博客给出的。 还看到一个文章说&#xff…

框架的使用

什么是框架&#xff1f; 盖房子&#xff0c;框架结构 框架结构就是房子主体&#xff0c;基本功能 把很多基础功能已经实现&#xff08;封装了&#xff09; 框架&#xff1a;在基础语言之上&#xff0c;对各种基础功能进行封装&#xff0c;方便开发者&#xff0c;提高开发效…

3D ToF赋能小米CyberDog 2提升视觉灵敏度

随着科技的进步,智能机器人越来越多地融入我们的日常生活。其中,CyberDog 2作为一款前沿的四足机器人,凭借其出色的视觉灵敏度和多功能技术配备,受到了广泛的关注。本文将重点探讨CyberDog 2的视觉系统,尤其是其四种不同类型的摄像头如何共同提升其视觉灵敏度,以及激光传…

书生·浦语大模型实战营第二期作业六

1、安装环境&#xff1a; 2、安装legent和agentlego&#xff1a; 3、部署apiserver&#xff1a; 4、legent web demo&#xff1a; 5、没搜到&#xff0c;很尴尬&#xff1a; 6、自定义工具&#xff1a; 7、智能体“乐高”&#xff1a; 8、智能体工具&#xff0c;识别图片&#…

C++ 矩阵乘法

描述 如果A是个x行y列的矩阵&#xff0c;B是个y行z列的矩阵&#xff0c;把A和B相乘&#xff0c;其结果将是另一个x行z列的矩阵C。这个矩阵的每个元素是由下面的公式决定的 矩阵的大小不超过100*100 输入描述&#xff1a; 第一行包含一个正整数x&#xff0c;代表第一个矩阵的…

Vue32-挂载流程

一、init阶段 生命周期本质是函数。 1-1、beforeCreate函数 注意&#xff1a; 此时vue没有_data&#xff0c;即&#xff1a;data中的数据没有收到。 1-2、create函数 二、生成虚拟DOM阶段 注意&#xff1a; 因为没有template选项&#xff0c;所以&#xff0c;整个div root都…

华为od-C卷200分题目2 - 找城市

华为od-C卷200分题目2 - 找城市 题目描述 一个城市规划问题&#xff0c;一个地图有很多城市&#xff0c;两个城市之间只有一种路径&#xff0c;切断通往一 个城市i的所有路径之后&#xff0c;其他的城市形成了独立的城市群&#xff0c;这些城市群里最大的城 市数量&#xff0…

VirtualBox、Centos7下安装docker后pull镜像问题、ftp上传文件问题

Docker安装篇(CentOS7安装)_docker 安装 centos7-CSDN博客 首先&#xff0c;安装docker可以根据这篇文章进行安装&#xff0c;安装完之后&#xff0c;我们就需要去通过docker拉取相关的服务镜像&#xff0c;然后安装相应的服务容器&#xff0c;比如我们通过docker来安装mysql,…

【Android面试八股文】说一说JVM、DVM(Dalvik VM)和ART的区别

文章目录 1. JVM(Java Virtual Machine):2. DVM(Dalvik Virtual Machine):与JVM区别基于的架构不同执行的字节码不同3. ART(Android Runtime):与DVM的区别4. 什么是JIT?4.1 什么是JIT4.2 JIT 编译的优势包括:4.3 对于 DVM 和 ART,它们在 JIT(Just-In-Time)编译方…

【flink实战】flink-connector-mysql-cdc导致mysql连接器报类型转换错误

文章目录 一. 报错现象二. 方案二&#xff1a;重新编译打包flink-connector-cdc1. 排查脚本2. 重新编译打包flink-sql-connector-mysql-cdc-2.4.0.jar3. 测试flink环境 三. 方案一&#xff1a;改造flink连接器 一. 报错现象 flink sql任务是&#xff1a;mysql到hdfs的离线任务&…

基于ASRPRO智能离线语音识别模块实现人机交流对话应用

基于ASRPRO智能离线语音识别模块实现人机交流对话应用 ASRPRO智能离线语音识别模块简介ASRPRO智能离线语音识别模块功能介绍ASRPRO智能离线语音识别模块电路说明ASRPRO智能离线语音识别模块应用案例ASRPRO智能离线语音识别模块管脚说明ASRPRO芯片管脚分布图ASRPRO语音识别模块系…

统计套利—配对交易策略

配对交易是一种基于统计学的交易策略&#xff0c;通过两只股票的差价来获取收益&#xff0c;因而与很多策略不同&#xff0c;它是一种中性策略&#xff0c;理论上可以做到和大盘走势完全无关。 配对交易的基本原理是&#xff0c;两个相似公司的股票&#xff0c;其股价走势虽然在…