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

news2024/11/26 4:48:42

不同版本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.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
  • 默认创建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);
#endif
    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();
}
  • 相比于QT6的版本,main.cpp文件中多了个低版本情况下启用高DPI下屏幕自适应的设置

1.4 main.qml

import QtQuick 2.15
import QtQuick.Window 2.15

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

二、QT6新建QML项目

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

2.1 目录结构

在这里插入图片描述

2.2 .pro文件内容

QT += quick

SOURCES += \
        main.cpp

 resources.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 QtQuick

Window {
    width: 640
    height: 480
    visible: true
    title: 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: img
        source: "images/qt.png"
    }
    
  2. 绝对路径
    Image {
        id: img
        source: "qrc:/images/qt.png"
    }
    

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

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

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

  1. 相对路径
    Image {
        id: img
        source: "qt6_project/images/qt.png"
    }
    
  2. 绝对路径
    Image {
        id: img
        source: "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.coloradmin.cn/o/1321029.html

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

相关文章

2018年第七届数学建模国际赛小美赛B题世界杯足球赛的赛制安排解题全过程文档及程序

2018年第七届数学建模国际赛小美赛 B题 世界杯足球赛的赛制安排 原题再现&#xff1a; 有32支球队参加国际足联世界杯决赛阶段的比赛。但从2026年开始&#xff0c;球队的数量将增加到48支。由于时间有限&#xff0c;一支球队不能打太多比赛。因此&#xff0c;国际足联提议改变…

【K8S基础】-k8s的核心概念pod

一、Pod 是什么 1.1 Pod 的定义和概念 在Kubernetes中&#xff0c;Pod是创建或部署的最小/最简单的基本单位。一个Pod代表着集群上正在运行的一个进程&#xff0c;它封装了一个或多个应用容器&#xff0c;并且提供了一些共享资源&#xff0c;如网络和存储&#xff0c;每个Pod…

图片速览 PoseGPT:基于量化的 3D 人体运动生成和预测(VQVAE)

papercodehttps://arxiv.org/pdf/2210.10542.pdfhttps://europe.naverlabs.com/research/computer-vision/posegpt/ 方法 将动作压缩到离散空间。使用GPT类的模型预测未来动作的离散索引。使用解码器解码动作得到输出。 效果 提出的方法在HumanAct12&#xff08;一个标准但小规…

单片机计数功能

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、计数器是什么&#xff1f;1.1 应用 二、计数器原理框图及对输入信号的要求2.1 原理框图2.2对输入信号的要求 三、使用步骤3.1 配置为计数模式3.2 装初值3.3…

选择排序、快速排序和插入排序

1. 选择排序 xuanze_sort.c #include<stdio.h> #include<stdlib.h>//选择排序void xuanze_sort(int arr[],int sz){//正着for(int i0;i<sz;i){//外层循环从第一个数据开始依次作为基准数据for(int j i1;j<sz;j){//int j i1 因为第一个数据作为了基准数据&…

蓝桥杯嵌入式——KEY

CUBE里将这几个引脚配置成GPIO输入模式&#xff0c;再同时选中&#xff0c;配置成上拉&#xff0c;如下图&#xff1a; 同时配置定时器&#xff0c;定时10ms&#xff0c;每10ms扫描一次按键&#xff0c;计算公式&#xff1a;80 000 000 / 80 / 10000 100HZ 10ms&#xff0c;配…

Amazon SageMaker机器学习之旅的助推器

授权声明&#xff1a;本篇文章授权活动官方亚马逊云科技文章转发、改写权&#xff0c;包括不限于在 亚马逊云科技开发者社区, 知乎&#xff0c;自媒体平台&#xff0c;第三方开发者媒体等亚马逊云科技官方渠道。 一、前言 在当今的数字化时代&#xff0c;人工智能和机器学习已经…

Spring Boot自动装配原理以及实践

了解自动装配两个核心 Import注解的作用 Import说Spring框架经常会看到的注解&#xff0c;它有以下几个作用: 导入Configuration类下所有的bean方法中创建的bean。导入import指定的bean&#xff0c;例如Import(AService.class)&#xff0c;就会生成AService的bean&#xff0…

Gitlab仓库推送到Gitee仓库的一种思路

文章目录 Gitlab仓库推送到Gitee仓库的一种思路1、创建Gitee的ssh公钥&#xff08;默认已有Gitlab的ssh公钥&#xff09;2、添加Gitlab远程仓库地址3、添加Gitee远程仓库地址4、拉取Gitlab远程仓库指定分支到本地仓库指定分支&#xff08;以test分支为例&#xff09;5、推送本地…

C++11特性:可调用对象以及包装器function的使用

在C中存在“可调用对象”这么一个概念。准确来说&#xff0c;可调用对象有如下几种定义&#xff1a; 是一个函数指针&#xff1a; int print(int a, double b) {cout << a << b << endl;return 0; } // 定义函数指针 int (*func)(int, double) &print…

【MAC】M2 安装mysql

一、docker下载地址 下载地址 二、安装docker完成 三、安装mysql 一、拉取镜像 # 拉取镜像 docker pull mysql# 或者 docker pull mysql:latest# 以上两个命令是一致的&#xff0c;默认拉取的就是 latest 版本的# 我们还可以用下面的命令来查看可用版本&#xff1a; docker…

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

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

Docker单点部署[8.11.3] Elasticsearch + Kibana + ik分词器

文章目录 一、Elasticsearch二、Kibana三、访问四、其他五、ik分词器第一种&#xff1a;在线安装第二种&#xff1a;离线安装 Elasticsearch 和 Kibana 版本一般需要保持一致才能一起使用&#xff0c;但是从 8.x.x开始&#xff0c;安全验证不断加强&#xff0c;甚至8.x.x之间…

【每日一题】—— C. Largest Subsequence(Codeforces Round 915 (Div. 2))(规律、字符串处理)

&#x1f30f;博客主页&#xff1a;PH_modest的博客主页 &#x1f6a9;当前专栏&#xff1a;每日一题 &#x1f48c;其他专栏&#xff1a; &#x1f534; 每日反刍 &#x1f7e1; C跬步积累 &#x1f7e2; C语言跬步积累 &#x1f308;座右铭&#xff1a;广积粮&#xff0c;缓称…

制作一个多行时正确宽度的Textview,Android Textview 换行时宽度过长 右侧空白区域挤掉页面元素的解决方案

优化 Android 布局&#xff1a;创建自适应宽度的 TextView 引言 在Android应用开发中&#xff0c;布局优化是提升应用性能和用户体验的关键环节之一。特别是对于那些内容密集型的应用&#xff0c;如何高效地展示和管理文本内容成为了一个挑战。最近&#xff0c;在处理一个布局…

市场全局复盘 20231218

昨日回顾: SELECT CODE,成交额排名,净流入排名,代码,名称,DDE大单金额,涨幅,主力净额,DDE大单净量,CONVERT(DATETIME, 最后封板, 120) AS 最后封板,涨停分析,_3日涨幅百分比,连板天,封单额,封单额排名,DDE散户数量,总金额,获利盘 FROM dbo.全部A股20231218_ALL WHERE 连板天…

社交网络分析4(下):社交网络链路预测分析、LightGBM框架、LLSLP方法(LightGBM 堆叠链路预测)、堆叠泛化 、社交网络链路预测分析的挑战

社交网络分析4 写在最前面LightGBMLightGBM简介GBDT的核心概念和应用LightGBM的特点LightGBM与GBDT的比较 LightGBM的原理与技术GBDT的传统算法LightGBM的创新算法 GOSS&#xff08;Gradient-based One-Side Sampling&#xff09;算法解析概念和工作原理算法的逻辑基础GOSS算法…

PIC单片机项目(4)——基于PIC16F877A的温度光照检测装置

1.功能设计 基于PIC16F877A单片机&#xff0c;使用DS18B20进行温度测量&#xff0c;使用光敏电阻进行光照测量&#xff0c;将测量值实时显示在LCD1602屏幕上&#xff0c;同时可以设定光照阈值和温度阈值。当温度大于阈值&#xff0c;则蜂鸣器报警&#xff0c;当光照小于阈值&am…

EnvoyFilter API

目录 原文链接 https://onedayxyy.cn/docs/EnvoyFilter-API 本节实战 实战名称&#x1f6a9; 实战&#xff1a;EnvoyFilter API-全局范围-2023.12.18(测试成功)&#x1f6a9; 实战&#xff1a;EnvoyFilter API-配置优先级-2023.12.18(测试成功)&#x1f6a9; 实战&#xff1a…

开发企业展示小程序的关键步骤和技巧

随着移动互联网的快速发展&#xff0c;小程序已经成为企业展示形象、推广产品和服务的重要工具。拥有一个优秀的小程序可以帮助企业提高品牌知名度&#xff0c;吸引更多潜在客户&#xff0c;提升用户体验。以下是拥有一个展示小程序的步骤&#xff1a; 确定需求和目标 首先&am…