QML组合模式(Composition Mode)

QML是一种面向对象的跨平台脚本语言,用于描述用户界面和交互逻辑,常用于移动、桌面和Web应用开发。其XML语法简洁,支持自定义组件,能提高开发效率和应用质量。QML的使用场合包括移动应用的快速构建,桌面应用的高效设计以及Web应用的界面创建。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

目录

一 QML介绍

二 QML的使用场合

三 实例演示


一 QML介绍

QML是Qt Quick的缩写,它是一种新型的、面向对象的、跨平台的脚本语言,可以用来描述用户界面或应用程序的交互逻辑。QML可以在Qt应用程序中使用,也可以在其他JavaScript应用程序中使用。

QML使用XML语法来描述应用程序的用户界面,其中包括各种组件、布局、控件和事件处理程序等。这种语言非常易于学习和使用,因为它具有简单的语法、清晰的结构和易于理解的类型系统。此外,QML还支持自定义组件和自定义控件,使开发人员能够根据需要灵活地设计和重构用户界面。

QML可以帮助开发人员快速构建原生桌面应用程序、移动应用程序和Web应用程序等。由于它是Qt框架的一部分,因此可以利用Qt提供的丰富功能和工具,如Qt Creator、Qt Widgets等。因此,使用QML可以大大提高开发效率和应用程序的质量。

二 QML的使用场合

QML是一种用于描述应用程序用户界面的声明式编程语言,主要应用于移动应用程序、桌面应用程序和Web应用程序等领域。以下是QML主要应用场景:

移动应用程序:QML可以帮助开发人员快速构建原生移动应用程序,如游戏、音乐播放器、地图应用等。由于QML可以将用户界面分解为一个个小的元素,并且可以对这些元素进行美化和自定义,因此非常适合构建移动应用程序。

桌面应用程序:QML可以用于开发桌面应用程序,如窗口管理器、文本编辑器、数据分析工具等。QML可以将界面分解为各个小的部件,并且可以使用Qt提供的各种组件和工具来构建高效的桌面应用程序。

Web应用程序:QML可以用于开发Web应用程序,如网页浏览器、表单验证器、媒体播放器等。由于QML可以将界面分解为小的元素,并且可以使用JavaScript来操作这些元素,因此非常适合构建Web应用程序。

QML是一种非常灵活和易于使用的编程语言,可以帮助开发人员快速构建高效的用户界面,并且可以在不同的应用程序领域中使用。

三 实例演示

以下是在 QML 布局中需要注意的一些事项:

  1. 在 main.qml 文件中定义的 MouseArea 局部有效,在其它的 .qml 文件定义的 MouseArea 全局有效。
  2. 帮助文档没列出的方法、成员变量、信号、槽,可以利用代码提示得到,如:TreeView的__currentRow。
  3. C++ 暴露方法给 QML 时,传递的变量是强类型,而 QML 的 ECMAScript 传递的变量是弱类型。
  4. C++ 的方法要定义为 public slots 才可以暴露方法给 QML,而 private slots 不可以。
  5. 在 C++ 或 QML 调用图片、视频等资源文件时,需要先添加到工程,才可以调用,调用时以工程的相对路径为准。
  6. 删掉了某一资源文件,编译时出错,可以删掉release、debug整个文件夹,重新编译就可以了。
  7. 如果要用鼠标拖动一个 Rectangle,那么这个 Rectangle 不能使用锚布局,只能用 x、y、width、height 来布局,拖动时,改变 x、y 即可。
  8. TextField 有 inputMask 属性,可以限制输入文字的范围。
  9. 在 qml 上使用过多 Timer,可能导致界面有点卡,用 c++ 开个 timer线程再发射信号到 qml 即可解决。
  10. 修改了除 main.qml 以外的 qml 文件,发现编译时现象跟代码不相符,可以删掉release、debug整个文件夹再重新编译,或者重新构建项目,再编译就可以了(Qt5.7.0才有这个bug,Qt5.9.2没有)。
  11. QML 调用C++对象时,C++对象的构造函数会执行两次,这时可以把该构造函数内容写在 qml 的Component.onComplete中。
//组合允许你绘制一个形状然后与已有的像素点集合混合。画布提供了多种组合模式,使用//globalCompositeOperation(mode)来设置。


1.    onPaint: {
2.        var ctx = getContext("2d")
3.        ctx.globalCompositeOperation = "xor"
4.        ctx.fillStyle = "#33a9ff"
5.
6.        for(var i=0; i<40; i++) {
7.            ctx.beginPath()
8.            ctx.arc(Math.random()*400, Math.random()*200, 20, 0, 2*Math.PI)
9.            ctx.closePath()
10.            ctx.fill()
11.        }
12.    }
下面这个例子遍历了列表中的组合模式,使用对应的组合模式生成了一个矩形与圆形的组合。
1.    property var operation : [
2.        'source-over', 'source-in', 'source-over',
3.        'source-atop', 'destination-over', 'destination-in',
4.        'destination-out', 'destination-atop', 'lighter',
5.        'copy', 'xor', 'qt-clear', 'qt-destination',
6.        'qt-multiply', 'qt-screen', 'qt-overlay', 'qt-darken',
7.        'qt-lighten', 'qt-color-dodge', 'qt-color-burn',
8.        'qt-hard-light', 'qt-soft-light', 'qt-difference',
9.        'qt-exclusion'
10.        ]
11.
12.    onPaint: {
13.        var ctx = getContext('2d')
14.
15.        for(var i=0; i<operation.length; i++) {
16.            var dx = Math.floor(i%6)*100
17.            var dy = Math.floor(i/6)*100
18.            ctx.save()
19.            ctx.fillStyle = '#33a9ff'
20.            ctx.fillRect(10+dx,10+dy,60,60)
21.            // TODO: does not work yet
22.            ctx.globalCompositeOperation = root.operation[i]
23.            ctx.fillStyle = '#ff33a9'
24.            ctx.globalAlpha = 0.75
25.            ctx.beginPath()
26.            ctx.arc(60+dx, 60+dy, 30, 0, 2*Math.PI)
27.            ctx.closePath()
28.            ctx.fill()
29.            ctx.restore()
30.        }
31.    }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

code_shenbing

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值