QML初识

news2025/2/10 5:58:27

目录

一、关于QML

二、布局定位和锚点

1.布局定位

2.锚点详解

三、数据绑定

1.基本概念

2.绑定方法

3.数据模型绑定

四、附加属性及信号

1.附加属性

2.信号


一、关于QML

QML是Qt框架中的一种声明式编程语言,用于描述用户界面的外观和行为;Quick是Qt框架中的一个模块,允许开发者使用QML来创建用户界面。

特点:

  • 声明式语法:QML采用声明式语法,开发者只需描述界面的外观和行为,而无需关注具体的绘制和布局细节。
  • 与JavaScript的无缝集成:QML可以与JavaScript无缝集成,利用JavaScript的强大功能进行应用程序逻辑的处理。
  • 高效的开发流程:QML将界面设计与应用程序逻辑分离,提高了开发效率。设计师可以专注于界面的设计,而开发者可以专注于应用程序的逻辑实现。
  • 丰富的组件库:Qt Quick提供了丰富的可视化组件、交互类型、动画、模型和视图等,如按钮、文本框、滑块、菜单等,方便开发者快速构建用户界面。
  • 高效的动画和图形处理能力:支持各种图形渲染技术,如OpenGL、WebGL等,可以创建流畅的动画和视觉吸引人的应用程序。
  • 响应式设计:控件可以自动适应不同的屏幕尺寸和设备,确保应用程序在各种设备上都能有良好的用户体验。

      

二、布局定位和锚点

1.布局定位

  • 手动布局:通过设置元素的xy属性,可以将元素放置在特定的坐标位置。这种方式适用于需要精确控制元素位置的场景,但在处理复杂布局时不够灵活。
  • 定位器布局:Qt Quick提供了几种定位器类型,如RowColumnGridFlow,用于自动定位元素。这些定位器可以根据元素的添加顺序和属性设置,将元素排列成一行、一列、网格或流式布局。
  • 锚点布局:锚点布局是QML中最灵活的布局方式,通过指定元素的锚点属性,可以将元素相对于其父元素或其他元素进行定位。

    

2.锚点详解

每个元素都有七条锚线:左、水平中心、右、上、垂直中心、下和基线。通过设置这些锚线的属性,可以实现元素的对齐、填充和偏移等效果。

基本锚点属性:

  • anchors.left:将元素的左边与指定元素的左边对齐。
  • anchors.right:将元素的右边与指定元素的右边对齐。
  • anchors.top:将元素的上边与指定元素的上边对齐。
  • anchors.bottom:将元素的下边与指定元素的下边对齐。
  • anchors.horizontalCenter:将元素的水平中心与指定元素的水平中心对齐。
  • anchors.verticalCenter:将元素的垂直中心与指定元素的垂直中心对齐。
  • anchors.baseline:将元素的基线与指定元素的基线对齐。

特殊锚点属性:

  • anchors.fill:将元素的左边、右边、上边和下边都与指定元素的对应边对齐,实现元素的填充效果。
  • anchors.centerIn:将元素的水平中心和垂直中心都与指定元素的水平中心和垂直中心对齐,实现元素的居中效果。

锚点边距和偏移:

  • 可以通过leftMarginrightMargintopMarginbottomMargin属性设置元素的锚点边距,以指定元素与锚点之间的空白空间量。
  • 还可以使用horizontalCenterOffsetverticalCenterOffset属性设置元素的锚点偏移,以实现更精细的定位控制。

注意事项:

  • 锚点布局的优先级大于绝对定位(即设置xy属性)。
  • 元素的锚点只能设置为其父元素或兄弟元素,不能设置为其他无关元素。

   

示例:

import QtQuick

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

    Item {
        id: mItem
        anchors.fill: parent

        Rectangle {
            id: bk
            anchors.fill: mItem
            color: "aliceblue"
        }

        Rectangle {
            width: 50
            height: 50
            color: "red"
        }
        Rectangle {
            x: 50
            y: 50
            width: 50
            height: 50
            color: "blue"
        }

        Rectangle {
            id: rect_center
            anchors.centerIn: parent
            width: 50
            height: 50
            color: "red"
        }

        Rectangle {
            id: rect_right
            anchors.right: parent.right
            anchors.verticalCenter: parent.verticalCenter
            anchors.rightMargin: 20
            width: 50
            height: 50
            color: "green"
        }

        Rectangle {
            id: rect_bottom
            anchors.bottom: parent.bottom
            anchors.horizontalCenter: parent.horizontalCenter
            anchors.bottomMargin: 20
            width: 50
            height: 50
            color: "green"
        }

        Rectangle {
            id: rect_1
            anchors.right: rect_center.left
            anchors.verticalCenter: parent.verticalCenter
            anchors.bottomMargin: 20
            width: 50
            height: 50
            color: "pink"
        }

        Rectangle {
            id: rect_2
            anchors.bottom: rect_center.top
            anchors.horizontalCenter: parent.horizontalCenter
            width: 50
            height: 50
            color: "pink"
        }
    }
}

运行结果:

    

三、数据绑定

1.基本概念

  • 属性绑定:QML中的属性绑定允许将一个属性的值与另一个属性或表达式进行关联。当关联的属性或表达式的值发生变化时,绑定的属性会自动更新。
  • 单向绑定:QML中的属性绑定通常是单向的,即从数据源到目标属性。这意味着当数据源属性发生变化时,目标属性会自动更新,但反之不然。
  • 动态绑定:QML支持动态绑定,这意味着绑定关系可以在运行时更改。这允许根据应用程序的状态或用户交互来动态更新界面。

ps:在使用属性绑定时,应避免创建循环绑定,这可能导致无限循环和性能问题。

      

2.绑定方法

  • 冒号绑定:这是最常见的绑定方法,使用冒号操作符“:”在属性定义时进行绑定。
  • 使用Binding对象:QML提供了Binding类型来实现更灵活的属性绑定。可以通过创建Binding对象并设置其targetpropertyvalue属性来定义绑定。
  • 使用Qt.binding()函数:可以在JavaScript代码中使用Qt.binding()函数来创建绑定,这种方法允许在运行时动态创建绑定关系。

   

3.数据模型绑定

  • ListView和GridView:在Qt Quick中,可以使用ListViewGridView等组件来显示数据模型中的数据。通过将组件的model属性绑定到一个数据模型,可以实现数据的动态显示和更新。
  • 数据模型的创建:可以使用ListModelXmlListModel等类型在QML中创建数据模型。这些模型可以存储和管理数据,并通过绑定与UI组件进行交互。

  

示例:

import QtQuick
import QtQuick.Controls

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

    Item {
        id: mItem
        anchors.fill: parent

        property int number: Math.ceil(slider_num.value)

        Label {
            id: label_num
            anchors.centerIn: parent

            //方式1
            text: "value: " + Math.ceil(slider_num.value)

            //方式2
            //text: "value: " + parent.number
        }

        Slider {
            id: slider_num
            anchors.top: label_num.bottom
            anchors.horizontalCenter: parent.horizontalCenter
            anchors.topMargin: 20
            width: 300
            from: 0
            to: 100
            value: 25
        }

        //方式3
        // Binding {
        //     when: slider_num.value > 50
        //     target: label_num
        //     property: "text"
        //     value: "value: " + Math.ceil(slider_num.value)
        // }

        //方式4
        // Component.onCompleted: {
        //     //js数据绑定
        //     label_num.text = Qt.binding(function(){
        //         return "value: " + Math.ceil(slider_num.value);
        //     })
        // }
    }

}

运行结果:

   

四、附加属性及信号

1.属性

  • 基本属性:直接赋值(静态值或绑定表达式)。
  • 自定义属性:使用 property 关键字声明。

    

2.附加属性

  • 概念:附加属性是一种可以附加到QML对象的额外属性,用于在不破坏对象类型定义的情况下扩展对象的功能。
  • 使用场景:例如在处理用户界面中的键盘事件时,可以使用附加属性来启用或禁用特定对象的键盘输入。
  • 语法:通过在属性名前加上附加类型的名称来访问附加属性,例如Keys.enabled
  • 自定义附加属性:可以通过在C++中创建具有特定属性和信号的附加类型,并在运行时将其附加到特定对象来实现自定义附加属性。

    

3.信号

  • 概念:信号是QML对象发出的事件通知,用于在对象状态发生变化时通知其他对象。
  • 信号处理程序:信号处理程序是在信号发出时被调用的JavaScript函数,用于响应信号事件。
  • 语法:信号处理程序的命名格式为on<SignalName>,例如onClicked
  • 自定义信号:可以在QML中使用signal关键字自定义信号,并在信号发出时调用相关的信号处理程序。
  • 信号连接:可以使用connect方法将信号连接到其他信号或方法,以便在信号发出时执行特定的操作。

   

示例:

import QtQuick
import QtQuick.Controls

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

    Component.onCompleted: console.log("Window");

    Item {
        id: mItem
        anchors.fill: parent
        Component.onCompleted: console.log("Item");
    }

    Rectangle {
        anchors.fill: parent
        color: "aliceblue"
        Component.onCompleted: console.log("Rectangle");
    }

    SwipeView {
        anchors.fill: parent

        Rectangle {
            color: SwipeView.index === 0 ? "blue" : "black"
        }

        Rectangle {
            color: SwipeView.index === 0 ? "black" : "green"
        }

        Rectangle {
            color: SwipeView.index === 0 ? "black" : "red"
        }
    }
}
  • ===:比较两个值是否严格相等(值和类型都相等)。
  • ==:进行隐式类型转换后比较这两个值。
输出:
qml: Window
qml: Rectangle
qml: Item

    QML引擎初始化组件的顺序是 "从下到上",同一层级的子组件会按照它们在代码中的声明顺序反向触发onCompleted,父组件的onCompleted会先于子组件的onCompleted触发。

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

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

    相关文章

    查询已经运行的 Docker 容器启动命令

    一、导语 使用 get_command_4_run_container 查询 docker 容器的启动命令 获取镜像 docker pull cucker/get_command_4_run_container 查看容器命令 docker run --rm -v /var/run/docker.sock:/var/run/docker.sock cucker/get_command_4_run_container 容器id或容器名 …

    协议_CAN协议

    物理层特征 信号传输原理&#xff1a; CAN控制器根据CAN_L和CAN_H上的电位差来判断总线电平&#xff0c;总线电平分为显性电平&#xff08;CAN_H与CAN_L压差 2v&#xff09;、隐性电平&#xff08;CAN_H与CAN_L压差 0v&#xff09;&#xff0c;发送方通过总线电平的变化&am…

    QT修仙之路2-2 对话框 尚欠火候

    警告对话框 相关代码 错误对话框 相关代码 消息对话框 相关代码 询问对话框 相关代码 相关代码 警告对话框 QMessageBox::warning(this,"错误","账号密码不能为空",QMessageBox::Ok);错误对话框 QMessageBox msgBox(QMessageBox::Critical,"错误…

    NFT Insider #168:The Sandbox 推出新春{金蛇礼服}套装;胖企鹅合作 LINE Minini

    引言&#xff1a;NFT Insider 由 NFT 收藏组织 WHALE Members、BeepCrypto 联合出品&#xff0c; 浓缩每周 NFT 新闻&#xff0c;为大家带来关于 NFT 最全面、最新鲜、最有价值的讯息。每期周报将从 NFT 市场数据&#xff0c;艺术新闻类&#xff0c;游戏新闻类&#xff0c;虚拟…

    什么是deepseek?

    AI国产免费开源强大 DeepSeek 是由国内团队开发的一款开源人工智能工具库&#xff0c;专注于提供高效易用的 AI 模型训练与推理能力。它既包含预训练大语言模型&#xff08;如 DeepSeek-R1 系列&#xff09;&#xff0c;也提供配套工具链&#xff0c;助力开发者快速实现 AI 应用…

    容器服务基础

    1.腾讯云容器服务 使用该服务&#xff0c;开发者将无需安装、运维、扩展您的集群管理基础设施&#xff0c;只需进行简单的API调用&#xff0c;便可启动和停止 Docker 应用程序&#xff0c;查询集群的完整状态&#xff0c;以及使用各种云服务。 创建集群--创建工作负载/创建ingr…

    C++基础知识(二)之数据类型、指针和内存、数组

    六、C数据类型 1、sizeof运算符 sizeof运算符用于求数据类型或变量占用的内存空间。 用于数据类型&#xff1a;sizeof(数据类型) 用于变量&#xff1a;sizeof(变量名) 或 sizeof 变量名 注意&#xff1a; 在32位和64位操作系统中&#xff0c;同一种数据类型占用的内存空间…

    LLMs之DeepSeek r1:Logic-RL的简介、安装和使用方法、案例应用之详细攻略

    LLMs之DeepSeek r1&#xff1a;Logic-RL的简介、安装和使用方法、案例应用之详细攻略 目录 Logic-RL的简介 1、Logic-RL的特点 2、性能 Logic-RL 的安装和使用方法 1、安装 2、使用方法 数据准备 基础模型 指令模型 训练执行 实现细节 Logic-RL的案例应用 Logic-RL…

    【神经网络框架】非局部神经网络

    一、非局部操作的数学定义与理论框架 1.1 非局部操作的通用公式 非局部操作(Non-local Operation)是该研究的核心创新点,其数学定义源自经典计算机视觉中的非局部均值算法(Non-local Means)。在深度神经网络中,非局部操作被形式化为: 其中: 1.2 与传统操作的对比分析…

    22.[前端开发]Day22-CSS单位-CSS预处理器-移动端视口

    1 CSS常见单位详解 CSS中的单位 CSS中的绝对单位&#xff08; Absolute length units &#xff09; CSS中的相对单位&#xff08; Relative length units &#xff09; 1.em: 相对自己的font-size&#xff1b;如果自己没有设置, 那么会继承父元素的font-size 2.如果font-size中…

    URL调用本地Ollama模型

    curl http://192.168.2.247:11434/api/generate -d "{ \"model\": \"deepseek-r1:8b\", \"prompt\": \"Who r u?\" ,\"stream\":false}" 连续对话

    【python】matplotlib(animation)

    文章目录 1、matplotlib.animation1.1、FuncAnimation1.2、修改 matplotlib 背景 2、matplotlib imageio2.1、折线图2.2、条形图2.3、散点图 3、参考 1、matplotlib.animation 1.1、FuncAnimation matplotlib.animation.FuncAnimation 是 Matplotlib 库中用于创建动画的一个…

    ubuntu24.04安装布置ros

    最近换电脑布置机器人环境&#xff0c;下了24.04&#xff0c;但是网上的都不太合适&#xff0c;于是自己试着布置好了&#xff0c;留作有需要的人一起看看。 文章目录 目录 前言 一、确认 ROS 发行版名称 二、检查你的 Ubuntu 版本 三、安装正确的 ROS 发行版 四、对于Ubuntu24…

    接入 deepseek 实现AI智能问诊

    1. 准备工作 注册 DeepSeek 账号 前往 DeepSeek 官网 注册账号并获取 API Key。 创建 UniApp 项目 使用 HBuilderX 创建一个新的 UniApp 项目&#xff08;选择 Vue3 或 Vue2 模板&#xff09;。 安装依赖 如果需要在 UniApp 中使用 HTTP 请求&#xff0c;推荐使用 uni.requ…

    网络爬虫js逆向之异步栈跟栈案例

    【注意&#xff01;&#xff01;&#xff01;】 前言&#xff1a; 1. 本章主要讲解js逆向之异步栈跟栈的知识&#xff08;通过单步执行调试&#xff09; 2. 使用关键字搜定位加密入口 3. 本专栏通过多篇文章【文字案例】的形式系统化进行描述 4. 本文章全文进行了脱敏处理 5. 详…

    机器学习 - 需要了解的条件概率、高斯分布、似然函数

    似然函数是连接数据与参数的桥梁&#xff0c;通过“数据反推参数”的逆向思维&#xff0c;成为统计推断的核心工具。理解它的关键在于区分“参数固定时数据的概率”与“数据固定时参数的合理性”&#xff0c;这种视角转换是掌握现代统计学和机器学习的基础。 一、在学习似然函…

    【Spring】什么是Spring?

    什么是Spring&#xff1f; Spring是一个开源的轻量级框架&#xff0c;是为了简化企业级开发而设计的。我们通常讲的Spring一般指的是Spring Framework。Spring的核心是控制反转(IoC-Inversion of Control)和面向切面编程(AOP-Aspect-Oriented Programming)。这些功能使得开发者…

    [笔记] 汇编杂记(持续更新)

    文章目录 前言举例解释函数的序言函数的调用栈数据的传递 总结 前言 举例解释 // Type your code here, or load an example. int square(int num) {return num * num; }int sub(int num1, int num2) {return num1 - num2; }int add(int num1, int num2) {return num1 num2;…

    开放式TCP/IP通信

    一、1200和1200之间的开放式TCP/IP通讯 第一步&#xff1a;组态1214CPU&#xff0c;勾选时钟存储器 第二步&#xff1a;防护与安全里面连接机制勾选允许PUT/GET访问 第三步&#xff1a;添加PLC 第四步&#xff1a;点击网络试图&#xff0c;选中网口&#xff0c;把两个PLC连接起…

    (原创,可用)SSH实现内外网安全穿透(安全不怕防火墙)

    目前有A、B终端和一台服务器&#xff0c;A、B机器不能直接访问&#xff0c;服务器不能直接访问A、B终端但是A、B终端可以访问服务器&#xff0c;这个场景很像我们有一台电脑在单位内网&#xff0c;外机器想访问内网系统&#xff0c;可能大家目前想到的就是frp之类穿透工具&…