QML入门

First Step with QML

每个QML文件都包含两部分:一个import部分和一个对象声明部分。对用户界面来说,最常用的类型和函数都定义在QtQuick 这个模块里。

编写HelloWorld

先从编程世界起点HelloWorld开始,这里,我们先不建立Qt Project,从最简单的文本文件开始,避免复杂的项目结构带来的困惑。直接新建一个HolloWorld.qml文件,编写如下代码:

import QtQuick

Rectangle {
    width: 200
    height: 100
    color: "red"

    Text {
        anchors.centerIn: parent
        text: "Hello, World!"
    }
}

代码中,第一行import QtQuick 导入了QtQuick模块,这样,我们就可以用下面的RectangleText等常用的界面组件了。

在上面的代码中,Rectangle部分,我们定义了一个宽200像素,高100像素的红色矩形框,同时,在矩形框中放置了一段Hello, World!文本,该段文本的中心,与矩形框的中心对齐,类似excel单元格的居中对齐。

运行HelloWorld

怎么运行这段代码,如果建立Qt Project直接将这段代码放进Main.qml中能运行吗?很不幸,不能,这样会崩溃。这里我们直接在命令行使用qml命令运行HelloWorld.qml文件就可以。

qml HelloWorld.qml

我们做好的界面长这样:

请添加图片描述

更进一步,处理用户输入

新建一个ClickableHelloWorld.qml,内容如下:

import QtQuick

Rectangle {
    width: 200
    height: 100
    color: "red"

    Text {
        anchors.centerIn: parent
        text: "Hello, World!"
    }

    TapHandler {
        onTapped: parent.color = "blue"
    }
}

同样用qml命令运行此文件,显示的还是上面的红色HelloWorld界面,用鼠标点击之后,界面编程蓝色的,如下图:

请添加图片描述

代码中,增加了TapHandler对象。QML中,将事件称为signals,将处理信号的对象称为signal handlers。点击时tapped信号会被发射,该信号被onTapped处理,处理结果是将父元素(也就是Rectangle对象)的颜色变为蓝色。这段代码在触屏设备也生效(触屏时间也会发射tapped信号)。

属性绑定

QML文件中,对象及他们的属性组成了最基本的图形界面,QML语言允许属性之间以多种方式相互绑定,先看下面的例子(PropertyBindings.qml):

import QtQuick

Rectangle {
    width: 400
    height: 200

    Rectangle {
        width: parent.width / 2
        height: parent.height
        color: "blue"
    }

    Rectangle {
        width: parent.width / 2
        height: parent.height
        x: parent.width / 2
        color: "green"
    }
}

这个例子中,每个子矩形的长宽都与父矩形的长宽进行了对应的绑定,如果改变父矩形的尺寸,子矩形的尺寸也会自动跟着改变。类似下面这样:

请添加图片描述

动画

属性同样可以通过动画(animations)来动态地更新,看下面的例子(Animations.qml

import QtQuick

Rectangle {
    color: "lightgray"
    width: 200
    height: 200

    property int animatedValue: 0
    SequentialAnimation on animatedValue {
        loops: Animation.Infinite
        PropertyAnimation { to: 150; duration: 1000 }
        PropertyAnimation { to: 0; duration: 1000 }
    }

    Text {
        anchors.centerIn: parent
        text: parent.animatedValue
    }
}

在这个示例中,我们用property定义了一个animatedValue的属性,属性初值为0,然后在使用Animation on Property语句指定将SequentialAnimation动画用于animatedValue属性,SequentialAnimation作用是顺序运行下面指定的两个PropertyAnimation动画,循环次数loopsAnimation.Infinite无限循环,第一个PropertyAnimation动画,用1000ms的时间,将animatedValue变为150,第二个PropertyAnimation动画,用1000ms的时间,将animatedValue变为0。Text则将animatedValue显示出来。效果如下:

请添加图片描述

用于重用的用户自定义QML类型

QML允许用户自定义类型,下面的例子(MessageLabel.qml)展示了一个自定义的MessageLable类型。

import QtQuick

Rectangle {
    height: 50
    property string message: "debug message"
    property var msgType: ["debug", "warning" , "critical"]
    color: "black"

    Column {
        anchors.fill: parent
        padding: 5.0
        spacing: 2
        Text {
            text: msgType.toString().toUpperCase() + ":"
            font.bold: msgType == "critical"
            font.family: "Terminal Regular"
            color: msgType === "warning" || msgType === "critical" ? "red" : "yellow"
            ColorAnimation on color {
                running: msgType == "critical"
                from: "red"
                to: "black"
                duration: 1000
                loops: msgType == "critical" ? Animation.Infinite : 1
            }
        }
        Text {
            text: message
            color: msgType === "warning" || msgType === "critical" ? "red" : "yellow"
            font.family: "Terminal Regular"
        }
    }

}

这个类型使用Rectangle作为父组件,定义了messagemsgType两个属性,Column则将下面的两个Text对象放在同一列中展示,第一个Text对象用于展示msgType,将msgType转化为全大写并加上:,以Terminal Regular字体,显示msgType,如果msgTypecritical还会加粗显示,同时,如果msgTypecriticalwarning,则用红色字体,否则用黄色字体,当msgTypecritical时,还会对字体颜色color使用动画,在1000ms内,将字体颜色从红色变为黑色,并且无限循环进行。第二个Text对象则用对应颜色和字体显示message

使用此类型的代码如下(application.qml):

import QtQuick

Column {
    width: 180
    height: 180
    padding: 1.5
    topPadding: 10.0
    bottomPadding: 10.0
    spacing: 5

    MessageLabel{
        width: parent.width - 2
        msgType: "debug"
    }
    MessageLabel {
        width: parent.width - 2
        message: "This is a warning!"
        msgType: "warning"
    }
    MessageLabel {
        width: parent.width - 2
        message: "A critical warning!"
        msgType: "critical"
    }
}

运行qml application.qml,效果如下图:

请添加图片描述
最新文章和代码都放在github QML-Applications上,期待star。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

linux单机部署hadoop

1.下载安装包 https://archive.apache.org/dist/hadoop/common/ 2.上传压缩 3.修改配置文件 1)设置JDK的路径 cd /usr/local/software/hadoop-3.1.3/etc/hadoop vi hadoop-env.sh export JAVA_HOME=/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.402.b06-1.el7_9.x86_64/ 查看…

Zynq ultrascale+ 中断方式整理

摘要:目前一共整理三种中断,主要整理三种中断(AXI_GPIO、EMIO、PL-PS_irq)在PL和PS侧的使用 一、AXI_GPIO 这个IP可以用作单bit的输入和输出;也可以单独作为中断或者复位等使用; 使用AXI GPIO IP&#xff…

CSS案例-3.背景练习

效果1 用背景加入图标 效果2 将图片设为页面背景,图片主体在中间 效果3 鼠标放到导航栏上会变颜色 知识点 CSS背景 属性 描述 取值 background 复合属性 看独立属性 background-color 背景颜色 <color> background-image 背景图像 none | url background-repeat 背景…

分享几个适合大学生的副业兼职,大家可以根据自己的情况选择

有很多大学生想找一份兼职&#xff0c;既能打发时间&#xff0c;还能赚一些零花钱。一方面提升自己的生活质量&#xff0c;另一方面为家里减轻一些负担。同时也可以通过兼职来锻炼自己的能力&#xff0c;增加社会经验。今天跟大家分享几个适合大学生的副业兼职&#xff0c;大家…

fastjson反序列化-1.2.24漏洞利用与分析

0x01 利用条件 通过对fastjson基础知识的学习和反序列化流程的分析&#xff0c;发现它与我们之前学的常规的反序列化又不太一样。fastjson自己定义了一套反序列化规则&#xff0c;它不需要反序列化的类去继承Serializable接口&#xff0c;也不需要找readObject函数作为入口。相…

视觉SLAM理论到实践系列:补充——泊松公式证明

视觉SLAM理论到实践系列文章 下面是《视觉SLAM十四讲》学习笔记的系列记录的总链接&#xff0c;本人发表这个系列的文章链接均收录于此 视觉SLAM理论到实践系列文章链接 下面是专栏地址&#xff1a; 视觉SLAM理论到实践专栏 文章目录 视觉SLAM理论到实践系列文章视觉SLAM理论…

png格式怎么转成gif?一个小窍门快速转换

如何将png转换成gif动画&#xff1f;作为新媒体工作者&#xff0c;在日常办公中少不了使用到gif格式图片。那么&#xff0c;当我们遇到需要将png格式转换成gif格式的时候要怎么操作呢&#xff1f;很简单&#xff0c;使用gif动画图片&#xff08;https://www.gif.cn/&#xff09…

android studio的布局没有提示之SDK不匹配

我新建了一个项目&#xff0c;然后突然发现布局没有提示了&#xff1a; 我看了下我的build.gradle 我直接修改compileSdkVersion为30就能正常使用了

在微信小程序中或UniApp中自定义tabbar实现毛玻璃高斯模糊效果

backdrop-filter: blur(10px); 这一行代码表示将背景进行模糊处理&#xff0c;模糊程度为10像素。这会导致背景内容在这个元素后面呈现模糊效果。 background-color: rgb(255 255 255 / .32); 这一行代码表示设置元素的背景颜色为白色&#xff08;RGB值为0, 0, 0&#xff09;&a…

linux 基础总结

1、简述Raid0、raid1、aid5、Raid10的区别 RAID:redundant array of independent disks, 独立冗余磁盘阵列 磁盘阵列是由很多块独立的磁盘&#xff0c;组合成一个容量巨大的磁盘组&#xff0c;利用个别磁盘提供数据所产生加成效 果提升整个磁盘系统效能。利用这项技术&#x…

Scala--03--变量和数据类型

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 变量和数据类型1.注释2 变量和常量&#xff08;重点&#xff09;3 标识符的命名规范4 字符串输出5.IO 输入 输出键盘输入读写文件 IO 6.数据类型&#xff08;重点&a…

Alma Linux - Primavera P6 EPPM 安装及分享

引言 继上一期发布的Rocky Linux版环境发布之后&#xff0c;近日我又制作了基于Alma Enterprise Linux 的P6虚拟机环境&#xff0c;同样里面包含了全套P6 最新版应用服务 此虚拟机仅用于演示、培训和测试目的。如您在生产环境中使用此虚拟机&#xff0c;请先与Oracle Primaver…

选择电能表时电流规格是否越大越好

选择电能表时&#xff0c;电流规格是否越大越好是一个值得深入探讨的问题。实际上&#xff0c;这个问题的答案并不是绝对的&#xff0c;而是需要根据具体的使用场景和需求来进行权衡。下面&#xff0c;我将从多个方面对这一问题进行详细的分析和探讨。 一、电流规格与电能表的基…

达索的有限元分析软件Abaqus 2024版本下载与安装配置

目录 前言一、安装前准备二、Abaqus 安装总结 前言 Abaqus软件是一款广泛使用的有限元分析软件&#xff0c;可用于模拟各种工程应用程序&#xff0c;包括结构、流体力学、热传递、电磁和声学等。该软件提供了广泛的建模功能和多种求解器&#xff0c;可以帮助工程师预测材料和结…

面试笔记——Redis(缓存击穿、缓存雪崩)

缓存击穿 缓存击穿&#xff08;Cache Breakdown&#xff09;&#xff1a; 当某个缓存键的缓存失效时&#xff08;如&#xff0c;过期时间&#xff09;&#xff0c;同时有大量的请求到达&#xff0c;并且这些请求都需要获取相同的数据&#xff0c;这些请求会同时绕过缓存系统&a…

数据集笔记:METR-la 原始数据转input/ground truth

0 问题介绍 在交通预测/时间序列预测的论文中&#xff08;如论文笔记&#xff1a;Dual Dynamic Spatial-Temporal Graph ConvolutionNetwork for Traffic Prediction_dual dynamic spatial-temporal graph convolution ne-CSDN博客&#xff09; 模型输入的是过去12个时间片的…

掌握关键技巧!音频转换精灵如何使用?

在数字媒体时代&#xff0c;音频格式的转换已成为日常工作中不可或缺的一部分。为了满足这一需求&#xff0c;市场上涌现出众多音频转换工具。其中&#xff0c;音频转换精灵以其强大的功能和简便的操作赢得了广泛好评。本文将为你详细介绍如何使用该软件&#xff0c;让你轻松完…

Compose UI 之 Segmented buttons 分段按钮

Segmented buttons SegmentedButton 是一种分段式按钮组件,它允许用户在一组相关的选项中选择一个或几个。 上图中:① 单选的分段式按钮。② 多选的分段式按钮。 分段式按钮的几个特点: 分段式按钮是带有状态的按钮,又有单选和多选之分。 从设计上将,不论是单选或是多选…

C# StableDiffusion StableDiffusionSharp 脱离python臃肿的环境

目录 说明 效果 项目 代码 下载 C# StableDiffusion StableDiffusionSharp 脱离python臃肿的环境 说明 Stable Diffusion in pure C/C github地址&#xff1a;https://github.com/leejet/stable-diffusion.cpp C# Wrapper for StableDiffusion.cpp github地址&#x…

SWIFT(环球同业银行金融电讯协会)详细介绍

可以说&#xff0c;最严厉的金融制裁之一&#xff0c;莫过于切断俄罗斯与SWIFT的连接。SWIFT究竟又是什么&#xff0c;在金融领域占据如此重要的地位&#xff1f;本文将从理论、实操以及技术层面展开详尽分析。 本文纲要 前言 一、SWIFT是什么 二、SWIFT的成立背景和组织架…