不同版本QT使用qmake时创建QML项目的区别

不同版本QT使用qmake时创建QML项目的区别

文章目录

  • 不同版本QT使用qmake时创建QML项目的区别
  • 一、QT5新建QML项目
    • 1.1 目录结构
    • 1.2 `.pro` 文件内容
    • 1.3 `main.cpp`
    • 1.4 `main.qml`
  • 二、QT6新建QML项目
    • 2.1 目录结构
    • 2.2 `.pro`文件内容
    • 2.3 `main.cpp`
    • 2.4 `main.qml`
  • 三、两个版本使用资源文件的区别
    • 3.1 QT5添加资源文件
    • 3.2 QT6添加资源文件
    • 3.3 使用资源文件
  • 四、总结

对于高版本的QT,如果想要创建使用qmake构建,需要选择compat,如下图所示,但是指定不同的最小QT版本时,项目的默认结构会有不同。本文通过对QT5和QT6两种版本的默认项目进行分析,确定不同QT版本下怎么进行资源的管理。
在这里插入图片描述

一、QT5新建QML项目

选择最小的Qt版本为5.15,如下图:
在这里插入图片描述

1.1 目录结构

在这里插入图片描述

1.2 .pro 文件内容

QT += quick# You can make your code fail to compile if it uses deprecated APIs.
# In order to do so, uncomment the following line.
#DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x060000    # disables all the APIs deprecated before Qt 6.0.0SOURCES += \main.cppRESOURCES += 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
  • 默认创建qml.qrc文件并追加到RESOURCES,使用qml.qrc统一管理资源文件
  • .qrc文件中需要为每个资源指定一个前缀,在使用资源文件时,要以指定的前缀开头,利用前缀可以方便对资源进行分组管理等。以资源编辑器方式打开qml.qrc文件时如下所示,可以发现,资源文件的默认前缀为/

在这里插入图片描述

  • 新建的.qml文件会默认添加到.qrc文件中:
    在这里插入图片描述

    添加后的目录为:
    在这里插入图片描述

    注意:在QT5版本的项目中,添加QML文件时一定要选择添加到默认的.qrc文件中,如果选择添加到qt5_project.pro文件中,会像QT6版本的项目一样,只在.pro文件中向DISTFILES字段追加新建的QML文件。具体情况请参见下面的QT6新建QML文件。

1.3 main.cpp

#include <QGuiApplication>
#include <QQmlApplicationEngine>int main(int argc, char *argv[])
{
#if QT_VERSION < QT_VERSION_CHECK(6, 0, 0)QCoreApplication::setAttribute(Qt::AA_EnableHighDpiScaling);
#endifQGuiApplication 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();
}
  • 相比于QT6的版本,main.cpp文件中多了个低版本情况下启用高DPI下屏幕自适应的设置

1.4 main.qml

import QtQuick 2.15
import QtQuick.Window 2.15Window {width: 640height: 480visible: truetitle: qsTr("Hello World")
}
  • QT5的QML中导入模块时,需要指明模块的版本

二、QT6新建QML项目

选择最小的Qt版本为5.15,如下图:
在这里插入图片描述

2.1 目录结构

在这里插入图片描述

2.2 .pro文件内容

QT += quickSOURCES += \main.cppresources.files = main.qml 
resources.prefix = /$${TARGET}
RESOURCES += resources # 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
  • 默认使用resources管理资源文件,resources变量也需要追加到RESOURCES变量,该变量有两个成员:

    • resources.files保存所有资源文件的列表
    • resources.prefix表示使用资源文件时的前缀名,这和QT5的.qrc文件中的前缀名相对应
  • 新建的.qml文件时默认只会将新文件追加在.pro文件中的DISTFILES字段中
    在这里插入图片描述

    .pro文件变为:

    在这里插入图片描述

    添加后的目录结构为:

    在这里插入图片描述

    注意:这时如果想要使用新建的.qml文件,会报QQmlApplicationEngine failed to load component错,因为DISTFILES并不能告诉编译器新建了资源文件,如果想要正常使用,需要将资源文件的名字追加到resoures.file

    • 实际上,DISTFILES一般的用途为指明make编译时需要添加到dist目标中的文件,我们可以将其中指定的.qml文件删除掉,并不影响程序的运行

    最后的.pro文件如下图所示:

    在这里插入图片描述

2.3 main.cpp

#include <QGuiApplication>
#include <QQmlApplicationEngine>int main(int argc, char *argv[])
{QGuiApplication app(argc, argv);QQmlApplicationEngine engine;const QUrl url(u"qrc:/qt6_project/main.qml"_qs);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();
}

2.4 main.qml

import QtQuickWindow {width: 640height: 480visible: truetitle: qsTr("Hello World")
}
  • QT6中移除了QML版本控制,所以导入模块时不再需要指定版本号

三、两个版本使用资源文件的区别

此时向两个项目中都添加一个images文件夹,并向其中添加一张图片qt.png,目录结构分别变为:
在这里插入图片描述

资源文件需要先添加到项目中才可以使用,由于在两个版本中管理资源文件的方式并不相同,所以添加资源文件的方式也不同。

3.1 QT5添加资源文件

QT5默认使用.qrc管理资源文件,因此应该使用.qrc文件专门管理图片资源,参考——Qt 资源系统(Qt Resource System)。

由于本文主要对比两个版本的差异,这里直接右键qml.qrcqt.png添加到qml.qrc文件中,如下所示:
在这里插入图片描述

选择qt.png后,项目目录结构变为:
在这里插入图片描述

3.2 QT6添加资源文件

由于QT6默认在.pro文件中使用resources变量管理资源文件,所以添加资源时,直接将资源文件追加到resources.file后即可,如下:

在这里插入图片描述

追加后,项目目录结构变为:
在这里插入图片描述

3.3 使用资源文件

尽管在QT6版本中,默认情况下将资源的管理方式修改为了使用resources变量,但是通过编译时的执行过程可以发现,实际还是会生成一个qmake_resources.qrc文件,如下所示:
在这里插入图片描述

实际应该还是通过.qrc进行资源管理,所以在这两种方式下,使用资源文件的方式是相同的。

根据官方文档的描述,在使用图片时,有两种形式。以上面的QT5项目为例,使用图片的方式为:

  1. 相对路径
    Image {id: imgsource: "images/qt.png"
    }
    
  2. 绝对路径
    Image {id: imgsource: "qrc:/images/qt.png"
    }
    

注意,QT6项目的资源文件的默认前缀是/$${TARGET},其中$${TARGET}表示TARGET变量的值,默认情况下TARGET的值和.pro文件名相同。

所以在以上创建的QT6项目中,使用资源文件时需要添加的前缀就是/qt6_project,这从main.cpp文件里加载main.qml中也有体现:
在这里插入图片描述

因此,在上面的QT6项目中,使用图片的两种方式为:

  1. 相对路径
    Image {id: imgsource: "qt6_project/images/qt.png"
    }
    
  2. 绝对路径
    Image {id: imgsource: "qrc:/qt6_project/images/qt.png"
    }
    

四、总结

  1. QT5和QT6创建使用qmake编译的QML项目时,资源管理的方式不同:
    • QT5使用.qrc文件管理资源
    • QT6使用resources变量管理资源
  2. 两个版本中,资源的使用方式不同:
    • QT5中,创建qml文件时,默认添加到.qrc文件中,可以直接使用
    • QT6中,需要将新的资源文件(qml文件和图片等)手动追加到resources变量后才能使用
  3. 以上区别是创建不同QT版本项目时的默认设置,实际中,两种方式都可以用来管理资源。即:
    • 可以在QT6版本项目中手动创建.qrc文件管理资源
    • 可以在QT5版本项目中使用resources变量管理资源

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

手机大厂的自由窗口freeform功能基于aosp14/安卓14适配完成-千里马android framework实战开发

背景 hi&#xff0c;粉丝朋友们&#xff1a; 今年2023年已经块过去了&#xff0c;各个手机厂商已经开始适配aosp14&#xff0c;甚至有的是已经适配完成&#xff0c;明年市场就大部分手机出厂就都是android 14了。 近期有个马哥学员刚好求助马哥一个关于以前马哥课程里面自由窗…

【为数据之道学习笔记】5-7五类数据主题联接的应用场景

在数字化转型的背景下&#xff0c;华为的数据消费已经不再局限于传统的报表分析&#xff0c;还要支持用户的自助分析、实时分析&#xff0c;通过数据的关联&#xff0c;支持业务的关联影响分析以及对目标对象做特征识别&#xff0c;进行特定业务范围圈定、差异化管理与决策等。…

安装android studio

记录一下安装android studio的过程&#xff1a; 1.首先安装android studio到某一文件夹后&#xff0c;在C盘用户目录下可以看到.android文件夹。C:\Users\22515\AppData\Local\Google目录下也会出现AndroidStudio2022.2文件夹。&#xff08;注意&#xff1a;用户名&#xff0c…

如何访问AWS私有网络中的RDS (Mysql)

文章目录 小结问题及解决连接问题如何使用本地的Mysql Workbench对RDS进行访问 参考 小结 在AWS私有网络中部署了RDS (Mysql), 尝试通过外网成功地进行了访问. 问题及解决 连接问题 在AWS私有网络中部署了RDS (Mysql), 进行外网进行访问碰到了各种问题. 以下连接超时&…

(七)STM32 NVIC 中断、优先级管理及 AFIO 时钟的开启

目录 1. 中断相关知识简介 1.1 什么是中断 1.2 什么是内中断、外中断 1.3 什么是可屏蔽中断、不可屏蔽中断 2. CM3 内核中断介绍 2.1 F103系统异常清单 2.2 F103 外部中断清单 3. NVIC 简介 3.1 NVIC 寄存器简介 3.2 NVIC 相关寄存器的介绍 4. 中断优先级 4.1 优先…

python实现AES加解密小工具

需求 测试过程中需要对加密流量包进行加解密&#xff0c;有时候js太大调试过程中浏览器器会卡死。需要手动编写一个加解密工具对加解密信息处理。 实现 小工具是使用python3编写的 使用 python3 aes_tool.py encrypt "Hello, World!" key.txt --mode cfb python…

jconsole与jvisualvm

jconsole 环境变量配置好后 直接输入在cmd 输入jconsole 即可 jvisualvm cmd 输入jvisualvm jvisualvm 能干什么 监控内存泄露&#xff0c;跟踪垃圾回收&#xff0c;执行时内存、cpu 分析&#xff0c;线程分析… 运行&#xff1a;正在运行的 休眠&#xff1a;sleep 等待…

矩阵起源荣获“深圳企业创新(国际)纪录“殊荣

近期&#xff0c;第二十二届“深圳企业创新纪录”结果已经公示&#xff0c;矩阵起源凭借 MatrixOne 新一代超融合云原生异构数据库产品&#xff0c;荣获"深圳企业创新&#xff08;国际&#xff09;纪录"殊荣&#xff01; 该奖项由深圳市企业创新纪录组织委员会主办&a…

[德人合科技]——设计公司 \ 设计院图纸文件数据 | 资料透明加密防泄密软件

国内众多设计院都在推进信息化建设&#xff0c;特别是在异地办公、应用软件资产规模、三维设计技术推广应用以及协同办公等领域&#xff0c;这些加快了业务的发展&#xff0c;也带来了更多信息安全挑战&#xff0c;尤其是对于以知识成果为重要效益来源的设计院所&#xff0c;防…

NVMe over CXL技术如何加速Host与SSD数据传输?

在现代计算环境中&#xff0c;优化Host&#xff08;主机&#xff09;与device&#xff08;设备&#xff09;之间的数据传输速度对于提升系统整体性能和效率至关重要。目前业内主要有以下几种方案&#xff1a; Controller Memory Buffer (CMB)&#xff1a; CMB是一种集成在NVMe …

elastic:nested实现对满足条件的数组元素聚合查询

0. 引言 某些业务场景下&#xff0c;我们要对数组元素进行聚合查询&#xff0c;就需要用到nested数据类型&#xff0c;但部分场景是针对数组中指定的元素进行聚合&#xff0c;于是就需要对数组元素进行限定&#xff0c;今天来看看这种场景如何实现。 1. 数据准备 首先我们准…

flask搞个简单登录界面

登录界面 直接放上login.html模板&#xff1a; <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>Lo…