QML快速上手1 - 预备知识

news2024/11/15 7:18:42

目录

      • 前言
      • QtQuick 预备知识
        • 二维坐标系
        • text
        • image
        • mousearea
        • 组件
        • 定位元件
        • 布局项
        • 输入元素

前言

此笔记及后续所有笔记均基于如下环境

  • Qt Quick 2.12
  • Qt 5.12

参考文献: qmlbook

以下所有笔记均从上述qmlbook中选取精华得来,如果嫌英文太多或者原文太长,推荐看下面的内容速通


QtQuick 预备知识

二维坐标系

新建一个 quick 工程文件

main.qml 代码清单

import QtQuick 2.12
import QtQuick.Window 2.12

// 主window
Window {
    width: 640
    height: 480
    visible: true
    title: qsTr("Hello World")

    // 构建一个长方形
    // 左上角绘制点为[0,0]
    // 绘制长宽为176 96
    // Gradient给予长方形一个渐变底色
    Rectangle {
        id: rect1
        x: 12; y: 12
        width: 176; height: 96
        gradient: Gradient {
            GradientStop { position: 0.0; color: "lightsteelblue" }
            GradientStop { position: 1.0; color: "slategray" }
        }
        border.color: "slategray"
    }
}

quick 中的坐标系如下图所示

  • y 轴向下为正
  • x 轴向右为正

所有的组件绘制起点都是左上角点,所以代码中我们设置 Rectangle 的坐标为 [12,12] 即为绘制起点坐标

在这里插入图片描述


text

很简单,学过类似的声明式页面开发都知道这些英文代表什么,就不多废话了

仅就不易辨别或者 QT 自带特有的属性进行分析讲解

Text {
    width: 40; height: 120
    text: 'A very long text'

    // elide 表示文本省略的位置,省略位置会以三个英文原点代替
    // 这里表示中间省略,故文本最终展示为:"A...t"
    elide: Text.ElideMiddle

    style: Text.Sunken
    styleColor: '#FF4444'

    verticalAlignment: Text.AlignTop
}

image

Image {
    x: 12+64+12; y: 12
    // width: 72
    height: 72/2
    source: "assets/triangle_red.png"
    fillMode: Image.PreserveAspectCrop
    clip: true
}

mousearea

鼠标可点击位置

下方代码实现:点击左侧方形,改变右侧方形的显示与隐藏

Rectangle {
    id: rect1
    x: 12; y: 12
    width: 76; height: 96
    color: "lightsteelblue"

    // 设置一个点击区域
    // onClicked 点击后触发的方法
    MouseArea {
        id: area
        width: parent.width
        height: parent.height
        onClicked: rect2.visible = !rect2.visible
    }
}

Rectangle{
    id: rect2
    x: rect1.width+24; y:12
    width: 76; height: 96
    color: "deepskyblue"
}

组件

在 main.qml 同级目录下新建一个自定义组件文件 DemoBtn.qml
下方展示最终文件结构

在这里插入图片描述


以下简单案例实现:自定义一个按钮 DemoBtn,并给予其两个插槽,可更改按钮显示文本以及按钮点击事件;在主界面 main.qml 调用自定义按钮,实现组件复用

下方为 DemoBtn.qml 代码清单

import QtQuick 2.12

// 定义根元素
// 需要在根元素内定义接收的参数,让根元素下所有子元素调度
Rectangle {
    id: root

    // 既然这是一个自定义组件,就必须给予可传递的参数位置来改变组件内容
    // 导出属性使用 property alias
    property alias text: label.text
    // 导出信号或者其他触发方法使用 signal
    signal clicked

    width: 116; height: 26
    color: "lightsteelblue"
    border.color: "slategrey"

    Text {
        id: label
        anchors.centerIn: parent
        text: "Start"
    }
    MouseArea {
        anchors.fill: parent
        onClicked: {
            // 点击事件直接采用根元素接收来的参数clicked
            root.clicked()
        }
    }
}

回到咱们的 main.qml

由于处于同级目录,不需要 import 导入,直接使用自定义组件即可!

自定义组件名==文件名

// 由于我们编写的自定义组件文件名为DemoBtn.qml,所以使用该组件时依旧使用此名称
DemoBtn {
    id: button
    x: 12; y: 12

    // 传递text参数
    text: "innerText"
    // 传递点击事件参数
    onClicked: {
        status.text="Button click!!!"
    }
}

// 被控制的text组件
Text {
    id: status
    x: 12; y: 76
    width: 116; height: 26
    text: "waiting ..."
    horizontalAlignment: Text.AlignHCenter
}

组件复用还可以使用另外一种方法 Item

在开发大型项目时,几乎都采用此方法

修改自定义组件 DemoBtn.qml 代码为

import QtQuick 2.12

Item {
    id: root
    width: 116; height: 26

    property alias text: label.text
    signal clicked

    Rectangle {
        anchors.fill: parent
        color: "lightsteelblue"
        border.color: "slategrey"

        Text {
            id: label
            anchors.centerIn: parent
            text: "Start"
        }
        MouseArea {
            anchors.fill: parent
            onClicked: {
                root.clicked()
            }
        }
    }
}

定位元件

Column 列定位
在其中添加的组件都会按照列的方向竖直排列

Column{
    id: row
    x: 12; y:12

    // 每个组件之间垂直方向间隔
    spacing: 8

    // 所有组件(这里使用了我自己写的可复用组件,实际上就是一个带背景颜色的正方形)
    SimpleRect{}
    SimpleRect{color: "deepskyblue"}
    SimpleRect{color: "lightgreen"}
}

Row 行定位
水平方向,不做过多解释

Row{
    id: row
    x: 12; y:12
    spacing: 8
    SimpleRect{}
    SimpleRect{color: "deepskyblue"}
    SimpleRect{color: "lightgreen"}
}

Grid 栅格排列

Grid{
    id: row
    x: 12; y:12
    rows: 2
    columns: 2
    spacing: 8
    anchors.centerIn: parent
    SimpleRect{}
    SimpleRect{color: "deepskyblue"}
    SimpleRect{color: "lightgreen"}
    SimpleRect{color: "orange"}
}

Grid 搭配 Repeater 可以实现循环渲染元素的效果

Grid{
    id: row
    x: 12; y:12
    rows: 4
    columns: 4
    spacing: 8
    anchors.centerIn: parent

    // 将会渲染16个,4x4排列的,由正方形组成的矩阵
    Repeater{
        model: 16
        SimpleRect{}
    }
}

布局项

子组件通过对其父组件的各个锚点,实现精确定位
(这类似于 android 的约束布局,欠约束的子组件将会可以被改变位置)

使用 anchors 锚点作为定位手段

在这里插入图片描述


水平居中与垂直居中,并附带水平和垂直方向上的偏移

Rectangle{
    id: rect1
    anchors.fill: parent

    Rectangle{
        id: rect2
        width: 100; height: 100
        color: "deepskyblue"
        anchors.horizontalCenter: parent.horizontalCenter
        anchors.verticalCenter: parent.verticalCenter
        anchors.verticalCenterOffset: 10
        anchors.horizontalCenterOffset: -10
    }
}

指定方向锚点约束,并附加 margin

Rectangle{
    id: rect1
    anchors.fill: parent

    Rectangle{
        id: rect2
        width: 100; height: 100
        color: "deepskyblue"
        anchors.top: parent.top
        anchors.topMargin: 10
        anchors.left: parent.left
        anchors.leftMargin: 50
    }
}

输入元素

输入元素即文本输入框 TextInput

首先看一下焦点定位与键盘切换焦点示例

import QtQuick 2.5

Rectangle {
    width: 200
    height: 80
    color: "linen"

    TextInput {
        id: input1
        x: 8; y: 8
        width: 96; height: 20

        // 是否获取焦点
        focus: true
        text: "Text Input 1"

        // 点击键盘上的tab键后,焦点移动到哪一个组件上去
        KeyNavigation.tab: input2
    }

    TextInput {
        id: input2
        x: 8; y: 36
        width: 96; height: 20
        text: "Text Input 2"
        KeyNavigation.tab: input1
    }
}

使用 keys 进行按键检测,是不是想到实现一个角色控制游戏了?

import QtQuick 2.5

DarkSquare {
    width: 400; height: 200

    GreenSquare {
        id: square
        x: 8; y: 8
    }
    focus: true
    Keys.onLeftPressed: square.x -= 8
    Keys.onRightPressed: square.x += 8
    Keys.onUpPressed: square.y -= 8
    Keys.onDownPressed: square.y += 8
    Keys.onPressed: {
        switch(event.key) {
            case Qt.Key_Plus:
                square.scale += 0.2
                break;
            case Qt.Key_Minus:
                square.scale -= 0.2
                break;
        }

    }
}

下一期将讲述流元素的使用

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

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

相关文章

【论文系列解读】MiniGPT-4: 增强视觉语言理解与先进的大型语言模型

Minigpt4 MiniGPT-4: Enhancing Vision-Language Understanding with Advanced Large Language Models MiniGPT-4: 增强视觉语言理解与先进的大型语言模型 (0) 总结&实测 minigpt是先提出来的,将视觉编码器和LLM对齐,blip2和它还是有蛮大区别的。…

Python中对基本文件操作

1.文件的作用 保存数据放在磁盘中 2.打开文件 fopen(‘文件’,‘w’)或者fopen(‘文件’,‘r’) 3.文件操作 3.1 写数据(write) 如果文件不存在那么创建,如果存在那么就先清空,然后写入数据 对象open(“文件”,w) 对象.write(“写入数…

论文浅尝 | 用于推荐的知识自适应对比学习

笔记整理:俞洪涛,浙江大学硕士,研究方向为知识图谱表示学习 链接:https://dl.acm.org/doi/10.1145/3539597.3570483 动机 在基于知识图谱的推荐系统中,用户和项目的交互信息通常会在模型中占主导地位,而KG中…

OPA Gatekeeper对Kubernetes资源操作限制

OPA介绍 Open Policy Agent(OPA,发音为“oh-pa”)是一个开源的通用策略引擎,它统一了堆栈中的策略执行。OPA 提供了一种高级声明性语言,可让您将策略指定为代码和简单的 API,以从您的软件中卸载策略决策制…

第七十六天学习记录:计算机硬件技术基础:Intel系列微处理器

Intel系列微处理器概述 8086/8088微处理器 8086/8088微处理器是英特尔公司于1978年推出的16位处理器,在80年代是个非常流行的芯片,被广泛用于个人电脑和工作站。它是x86家族处理器的一员,被视为现代PC体系结构的基础。 8086/8088微处理器的…

对耳朵伤害最小的耳机类型,列举几款不入耳的骨传导耳机

骨传导耳机是最近几年火爆起来的耳机,它是将声音转化为不同频率的机械振动,通过人的颅骨、骨迷路、内耳淋巴液、螺旋器、听神经、听觉中枢来传递声波。与普通耳机相比最大的区别是声音不经过外耳道,避免了耳道长时间堵塞导致的中耳炎疾病发生…

基于机器学习算法:朴素贝叶斯和SVM 分类-垃圾邮件识别分类系统(含Python工程全源码)

目录 前言总体设计系统整体结构图系统流程图 运行环境Python 环境安装pytesseract注册百度云账号 模块实现1. 数据模块2. 模型构建3. 附加功能 系统测试1. 文字邮件测试准确率2. 网页测试结果 工程源代码下载其它资料下载 前言 本项目采用朴素贝叶斯和支持向量机(S…

石化园区宽带自组网应急通信方案

痛点需求 传统的通信手段在可靠性、即时性、安全性、可视化等方面的能力相对较弱,无法从根本上满足石化园区的应急通信需求。结合某大型石化园区实际需求,现亟需建设一套高可靠、高安全、广覆盖、机动灵活且支持多媒体通信的应急通信系统,以…

阿里云建站主机之虚拟主机、轻量或云服务器ECS

阿里云搭建网站主机可以选择云服务器ECS、云虚拟主机或轻量应用服务器,轻量应用服务器2核2G3M带宽一年108元,2核4G4M带宽轻量服务器一年297.98元12个月,云服务器ECS可以选择通用算力型u1,云虚拟主机共享型119元一年起,…

大数据Doris(四十三):kafka 简单json格式数据导入到Doris

文章目录 kafka 简单json格式数据导入到Doris 一、创建 Doris 表 二、创建 Kafka topic 三、创建 Ro

AI实战营:生成模型+底层视觉+AIGC多模态 算法库MMagic

目录 环境安装 黑白照片上色 文生图-Stable Diffusion 文生图-Dreambooth 图生图-ControlNet-Canny 图生图-ControlNet-Pose 图生图-ControlNet Animation 训练自己的ControlNet 环境安装 mim install mmagicpip install opencv-python pillow matplotlib seaborn tqdm …

阿里二面:使用 Nacos 做注册中心怎么做优雅发布?

大家好,我是君哥。 今天来聊一聊使用 Nacos 做注册中心怎么做优雅发布。 跟其他的注册中心一样,Nacos 作为注册中心的使用如下图: Service Provider 启动后注册到 Nacos Server,Service Consumer 则从 Nacos Server 拉取服务列表…

Unsafe类的使用

目录 一、Unsafe是什么?二、Unsafe对象的获取三、CAS1、相关方法2、demo 四、数组操作五、内存分配六、线程调度 参考于:https://blog.csdn.net/Wisimer/article/details/115220750 一、Unsafe是什么? Unsafe是jdk提供的一个直接访问操作系…

k8s 集群部署尝试

K8S 部署方式有很多,有的方式不太友好,需要注意很多关键点,有的方式对小白比较友好,部署简单方便且高效 二进制源码包的部署方式 使用 二进制源码包的方式部署会比较麻烦,大概分为如下几步: 获取源码包部…

基于abaqus的Huang晶体塑性UMAT改VUMAT

黄永刚院士编写的单晶晶体塑性UMAT,主要用于在Abaqus有限元仿真中进行单晶及多晶晶体塑性变形的计算,是许多科研工作者学习晶体塑性模拟的教学资源。可以在其基础上对硬化模型进行修改,甚至引入损伤。 UMAT主要应用于隐式分析,而…

力扣动态规划专题(二)01背包 416. 分割等和子集 1049.最后一块石头的重量II 494. 目标和 474. 一和零 步骤及C++实现

文章目录 01背包二维dp数组一维dp数组 滚动数组 416. 分割等和子集1049.最后一块石头的重量II494. 目标和474. 一和零 01背包 完全背包的物品数量是无限的,01背包的物品数量只有一个。 有n件物品和一个最多能背重量为w 的背包。第i件物品的重量是weight[i]&#xf…

基于ArcGIS的nc(NETCDF)转tif格式

软件版本:ArcMap10.4.1 nc(NETCDF)是一组独立于机器的软件库支持创建、访问和共享面向阵列的数据格式科学数据,它也是共享科学数据的社区标准。(摘自Unidata官网),被广泛应用于大气、海洋、水文等领域,是我…

stm32读取BH1750光照传感器

stm32读取BH1750光照传感器 一.序言二.BH1750指令三.IIC协议四.代码实例4.1 bh1750.c源文件4.2 bh1750.h头文件 一.序言 BH1750是用IIC协议进行数据传输的。有SCL,SDA,VCC,GND四根线。下图是原理图 二.BH1750指令 我们先看芯片手册的操作指令(下图&a…

直播 RTM 推流在抖音的应用与优化

动手点关注 干货不迷路 背景 随着互联网技术以及网络基建的快速发展和普及,视频直播已经成为了一种越来越普遍的娱乐和社交方式。无论是个人还是企业,都可以通过视频直播平台进行直播活动,向观众展示自己的生活、工作或者产品。同时&#xff…

有什么办法恢复格式后的u盘数据?5个方法,赶紧收藏起来

随着科技的不断进步,U盘已经成为了我们重要的移动存储设备之一,但是在使用过程中,很多人都可能会不小心将U盘格式化导致数据丢失。那么有什么办法恢复格式后的U盘数据?本文将会为您介绍恢复U盘格式化后数据的5种方法,如…