[QML]事无巨细开始实践QML开发(一)什么是QML,为什么学习QML,先写一个简单的页面
[QML]从零开始QML开发(一)什么是QML,为什么学习QML,先写一个简单的页面
QML开发和QWidget开发的区别
QML(Qt Meta-Object Language)是Qt提供的一种声明性语言,用于快速创建用户界面。相对而言,Qt Widgets是基于C++的桌面应用程序开发框架。
下面是QML和Qt Widgets之间的一些优缺点以及为何Qt公司大力推行QML开发的原因:
优点:
可视化设计:QML是一种基于标记的语言,使用了层叠样式表(CSS)类似的语法,使得界面设计变得直观轻松。
跨平台支持:QML与其他主流操作系统和设备无关,可以在多个平台上运行,包括桌面、移动和嵌入式设备。
快速迭代:QML具有热重载功能,可以实时编辑和查看界面的更改,加快了开发和调试的速度。
良好的动画和效果支持:QML通过内置的动画和效果组件,使得界面的交互和动态效果实现变得简单。
灵活和可维护性:QML允许将界面元素分解为可重用的组件,使得代码结构化,易于拓展和维护。
缺点:
学习曲线:QML需要学习新的语法和概念,相对于传统的C++开发,可能需要一些时间来适应和掌握。
性能:与原生C++应用程序相比,QML在某些情况下可能会有性能上的损失,尤其是在复杂界面或需要大量渲染的场景中。
Qt公司推行QML开发的原因:
用户体验:QML提供了现代化、用户友好的界面设计能力,可以创建吸引人且交互性强的用户界面。
多平台支持:QML通过跨平台的特性,可以将开发的应用程序轻松地移植到不同的操作系统和设备上,提高了开发效率和代码的重用性。
易用性和开发效率:QML的可视化设计和声明性语法使得开发者可以更快速地构建和迭代界面,减少了开发周期。
这也是一种真正在Qt上进行前后端分离的方案,这倒是挺新颖的。个人在简单体验了一下QML开发之后,感觉QML是一个很类似前端CSS的技术,把页面变成一个单独的模块,也算是一种完美贯彻MVC模式的工具吧(毕竟之前还是会有很多人把业务放到界面里面去写,而且也会被人疯狂乱喷)某种意义上来说,这也是一种真正在Qt上进行前后端分离的方案,这倒是挺新颖的。
另外值得一提的点,QML作为一种几乎是描述性语言的存在,其跨平台的支持理论上应该显著好于QWidget的,所以新项目的开发(大概率是要兼容多系统)尽量在QML的基础上开发吧!
这就又相当于是我学了一门新的语言了,但既然已经有了QWidget的开发经验,再去开发前端html页面想必难度也不会大到哪里去,那么就来看看效果吧
开发准备
作为一名高贵的windows开发,那自然是要使用宇宙第一IDE:Visual Studio 2022 + Qt 5.14.2
为什么不用Qt 6 ?因为我这台开发电脑上没有装Qt 6 ,不过具体使用起来大差不差。
然后比较重要的一点是,QML本身可能对中文的支持有点问题,也就是说QML中如果出现了中文,可能就会出现乱码。当然了不止QML中会出现乱码,在QWidget中也会出现乱码,不同的是可以在QWidget中使用#pragma characterset("utf8")解决,但是在QML文件中不允许这样的语法出现(实际上QML是一套自己的语法),所以只能通过保存文件为UTF-8 with BOM的方式来规避掉这种可能出现的问题。
这也是为什么我们说QML比较适合新项目----因为你也不能保证以前的老项目的代码文件是以UTF8 with BOM格式保存的,也不可能把以前的老代码全部转换成UTF8 with BOM,这个是比较需要注意的。
至于说怎么转,网上教程一大堆,我只说我的做法 : 下载插件 Format on Save for VS2022(当然了每个vs版本肯定都会有的)
具体方法就是:扩展--》管理扩展--》联机--》搜索并下载Format on Save for VS2022--》下载完成--》VS上方菜单栏点击工具--》选项--》Format On Save -->UTF8-->Enable ForceUtf8WithBom 改为True
OK,让我们开启我们的第一个项目,怎么创建的就不说了,反正就是你在创建项目的时候直接创建一个QtQuick项目就可以了,我们来直接看项目内部:

先来看main函数,这个
QCoreApplication::setAttribute(Qt::AA_EnableHighDpiScaling);
先不管,这一段是给整个程序设置了一个支持高DPI的模式,这个无所谓
QQmlApplicationEngine engine;
engine.load(QUrl(QStringLiteral("qrc:/main.qml")));
if (engine.rootObjects().isEmpty())
return -1;
在这段代码中,使用QQmlApplicationEngine来加载和运行一个QML界面。
首先,创建了一个QQmlApplicationEngine对象,该对象用于加载和管理QML应用程序。
然后,使用engine.load(QUrl(QStringLiteral("qrc:/main.qml")))语句加载名为"main.qml"的QML文件。在这里,使用QUrl::fromLocalFile()函数将文件路径转换为QUrl格式,"qrc:"表示该文件位于Qt资源(qrc)中。
接下来,通过engine.rootObjects().isEmpty()判断加载的QML界面是否成功。engine.rootObjects()返回根对象的列表,如果列表为空,则表示加载失败。
如果加载的QML界面成功,程序继续执行后续的逻辑。否则,返回-1,可能表示加载失败或发生错误。
简而言之,这段代码的作用是加载并检查一个QML界面是否成功加载,如果加载成功,则继续执行其他相关操作。
然后我们双击一下这个main.qml文件,进来看看,内容大概如下:

import QtQuick 2.12
import QtQuick.Window 2.12
import QtQuick.Controls 2.5
Window {
visible: true
width: 640
height: 480
title: qsTr("Hello World")
}
没错,就这么简单,就是几句话就表示了一个窗口,没有那么多规定复杂的构造函数,信号,Q_OBJECT宏之类的,而是一个由Qt完全封装好了的QML文件
让我们来编译执行一下,大概效果就是生成了一个窗口:

让我们来写一个按钮,添加代码如下:

import QtQuick 2.12
import QtQuick.Window 2.12
import QtQuick.Controls 2.5
Window {
visible: true
width: 640
height: 480
title: qsTr("Hello World")
Button{
x:100 //设置按钮的横坐标
y:100 //设置纵坐标
text:"我是按钮" //按钮标题
//一个类似JS风格的函数
function slotAnyway(){
console.log("slotAnyway")
}
//信号槽连接
onClicked: {
slotAnyway()
console.log("点击")
}
}
}
再编译执行一下:

然后按一下这个按钮就会弹出对应的提示。onClick是点击函数,至于这个函数是什么意思,将会在之后的文章中着重讲一下,这里不讲信号槽这些概念。
预览
写到这里,不禁让我头皮发麻,因为这里有一个非常严重的问题就是:我怎么知道现在界面是什么情况的?之前有一帮B开发就是用纯代码写QWidget,而且不能预览,调试起来真的麻烦的我想杀人。
当然了,Qt肯定也想到了这个问题,不然他们也不会一开始就提供.ui给用户去编辑了,相对的,Qt也肯定提供了一套QML的预览工具以供开发者调用,这个工具就是 :qmlscene.exe,这个工具的位置在你的Qt安装目录的指定版本下的bin目录,比如D:\DevTools\Qt_5.14.2\5.14.2\msvc2017_64\bin\qmlscene.exe

怎么用呢?其实也简单,就是直接双击qmlscene.exe,然后再选择指定的.qml文件就行了
当然了,这肯定有点低能,我们也不可能这么做。正确的做法是
右键main.qml->..打开方式->浏览->找到qmlscene.exe,注意不能设置为默认,否则你就不能编辑这个.qml文档了,只需要每次预览的时候双击一下就可以了
之后简单说一下关于QML控件、信号、槽、锚、属性相关的内容
调试
当然了,你肯定会好奇这种代码怎么调试,你会好奇地在qml字段上打上一个断点然后尝试调试,结果你发现行不通。
当然了,Qt也考虑到了这个问题,当你需要调试这个程序的时候,请右键项目-》属性-》Qt Project Settings->QML->Enable QMl Debugging->改为是,这样之后你在qml文件中打上的断点就可以被命中了,当然了这也带来一个问题,就是当你在之后删掉这个断点后,每次调试或者启动这个程序都会告诉你程序命中了断点但是找不到这个断点,不过这并不是什么首要的问题,不是吗?
[QML]事无巨细开始实践QML开发(一)什么是QML,为什么学习QML,先写一个简单的页面的更多相关文章
- 【阿菜做实践】利用go语言写一个简单的Pow样例
本篇博客的主要内容是用go写一个简单的Proof-of-Work共识机制,不涉及到网络通信环节,只是一个本地的简单demo.开发IDE用的是JB Golang. 整个项目的文件结构如下: PoWdem ...
- 从头学Qt Quick(3)-- 用QML写一个简单的颜色选择器
先看一下效果图: 实现功能:点击不同的色块可以改变文字的颜色. 实现步骤: 一.创建一个默认的Qt Quick工程: 二.添加文件Cell.qml 这一步主要是为了实现一个自定义的组件,这个组件就是我 ...
- 基于.NetCore开发博客项目 StarBlog - (1) 为什么需要自己写一个博客?
前言 OK,我也来造轮子了 博客系统从一开始用WordPress,再到后来用hexo.hugo之类的静态博客生成放github托管,一直在折腾 折腾是为了更好解决问题,最终还是打算自己花时间搞一个好了 ...
- web开发——写一个简单的表格导出操作
一.前台页面: 主要是一个按钮和一个表格,表格有显示数据,按钮负责将表格中的数据选择性地导出.除此外,可以附加一个小窗口和进度条,用于显示下载进度. 1. 按钮:<a href="ja ...
- UNIX-LINUX编程实践教程->第八章->实例代码注解->写一个简单的shell
一 分析 要实现一个shell,需包含3个步骤 1)读入指令 2)指令解析 3)执行指令 1 从键盘读入指令 从键盘读入指令的几个要点: 1)调用getc函数等待并获取用户键盘输入. 2)每一行命令的 ...
- [ionic3.x开发记录]参考ionic的float-label动效,写一个项目内通用的input组件,易扩展
上图: module: import {NgModule} from "@angular/core"; import {CommonModule} from "@angu ...
- React学习及实例开发(二)——用Ant Design写一个简单页面
本文基于React v16.4.1 初学react,有理解不对的地方,欢迎批评指正^_^ 一.引入Ant Design 1.安装antd yarn add antd 2.引入 react-app-re ...
- 用JetBrains PyCharm 开发工具写一个简单python案例
import urllib.request import re #解析html的内容 def getHtml(url): page=urllib.request.urlopen(url) html=p ...
- Cordova webapp实战开发:(6)如何写一个iOS下获取APP版本号的插件?
上一篇我们学习了如何写一个Andorid下自动更新的插件,我想还有一部分看本系列blog的开发人员希望学习在iOS下如何做插件的吧,那么今天你就可以来看看这篇文字了. 本次练习你能学到的 学习如何获取 ...
- HTML5实战教程———开发一个简单漂亮的登录页面
最近看过几个基于HTML5开发的移动应用,比如臭名昭著的12036移动客户端就是主要使用HTML5来实现的,虽然还是有点反应迟钝,但已经比较流畅了,相信随着智能手机的配置越来越高性能越来越好,会越来越 ...
随机推荐
- Centos7安装配置MySQL 5.6
Centos7安装配置MySql 5.6 首先下载MySql5.6的安装包,具体安装方式分为yum安装与离线安装.在新版本的CentOS7中,默认的数据库已更新为了Mariadb,而非 MySQL. ...
- Java——多线程(代码)
例子:创建三个窗口卖票,总票数为100张.使用实现Runnable接口的方式 * 1.卖票过程中出现重票.错票 --->出现了线程的安全问题 * 2.问题出现的原因:当某个线程操作车票的 ...
- 系统评价——理想点TOPSIS法的R语言实现(五)
TOPSIS 法是一种常用的综合评价方法,能充分利用原始数据的信息,其结果能精确地反映各评价方案之间的差距.TOPSIS全称Technique for Order Preference by Simi ...
- kubernetes(k8s)部署 Metrics Server 资源
资源使用指标,例如容器 CPU 和内存使用率,可通过 Metrics API 在 Kubernetes 中获得.这些指标可以直接被用户访问,比如使用 kubectl top 命令行,或者被集群中的控制 ...
- TypeScript必知三部曲(一)TypeScript编译方案以及IDE对TS的类型检查
TypeScript代码的编译过程一直以来会给很多小伙伴造成困扰,typescript官方提供tsc对ts代码进行编译,babel也表示能够编译ts代码,它们二者的区别是什么?我们应该选择哪种方案?为 ...
- 社工工具包setoolkit克隆网站钓鱼网站
实验主机:kali win10 (搭建好的dvwa靶场用于克隆登录页) setoolkit简介:setoolkit 是一个开源的社会工程学工具包.有很多选项可以使用更多操作读者自行探究. 实验开始: ...
- must be reducible node 错误
"must be reducible node"错误通常是由于使用了无法转换为表达式树的代码或表达式. 场景再现:在项目中使用GroupBy的时候,对字段进行了类型转换,接下来正常 ...
- Indent----- IndentationError: unexpected indent
Unexpected indent 错误 注意,Python 中实现对代码的缩进,可以使用空格或者 Tab 键实现.但无论是手动敲空格,还是使用 Tab 键,通常情况下都是采用 4 个空格长度作为一个 ...
- VS 输入快捷键propfull
大家都知道prop.propg输入快捷键. 当前我们需要生成一段包含属性和字段的代码时,可以propfull. propfull在安装了reshaper后,会被隐藏掉.没关系,直接敲propfull, ...
- abp(net core)+easyui+efcore实现仓储管理系统——供应商管理升级之下(六十四)
abp(net core)+easyui+efcore实现仓储管理系统目录 abp(net core)+easyui+efcore实现仓储管理系统--ABP总体介绍(一) abp(net core)+ ...