Qt开发-QT Quick

news2024/11/29 8:37:24

前言

QT Quick和Qt widgets这两种技术,官方是强推QT Quick的。

QT Quick中布局一般有如下四种方式,

  1. 绝对坐标:x、y、z、width、height、top、left
  2. 锚(anchors) 布局
  3. 定位器(Row、Column、Grid、Flow)
  4. 布局管理器(RowLayout、ColumnLayout、GridLayout、StackLayout)

绝对布局很好理解,给值就显示,但是不灵活;

anchors 实际上是 Item 的一个属性集

Row 则是一个单独的 Item ,专门用来管理其它 Item 的,后面介绍的几种布局,也是类似的。

锚(anchors) 布局的参数:

//左上右下对齐
anchors.left : AnchorLine
anchors.top : AnchorLine
anchors.right : AnchorLine
anchors.bottom : AnchorLine

//Margin
anchors.leftMargin : real
anchors.topMargin : real
anchors.rightMargin : real
anchors.bottomMargin : real
anchors.margins : real

//基线对齐及偏移
anchors.baseline : AnchorLine
anchors.baselineOffset : real


anchors.mirrored : bool
anchors.fill : Item

//居中与偏移
anchors.centerIn : Item
anchors.horizontalCenter : AnchorLine
anchors.verticalCenter : AnchorLine
anchors.horizontalCenterOffset : real
anchors.verticalCenterOffset : real

本文福利,费领取Qt开发学习资料包、技术视频,内容包括(C++语言基础,Qt编程入门,QT信号与槽机制,QT界面开发-图像绘制,QT网络,QT数据库编程,QT项目实战,QT嵌入式开发,Quick模块等等)↓↓↓↓↓↓见下面↓↓文章底部点击费领取↓↓

其中

  • real 具体的数值
  • Item是组建的ID或者parent
  • bool是true或false
  • AnchorLine 示例anchors.horizontalCenter: parent.horizontalCenter

注意

不要在Row或RowLayout相关的组件中使用anchors,会导致组件本身的特性不生效。

窗口设置

窗口的属性

Window {
	title: qsTr("一个普通标题窗口") //窗口标题
    width: 640  //宽度
    height: 480  //高度
    visible: true  //是否可见,缺省为true
    color: "#ffffff" //窗口背景色
    //#00000000 为窗口透明
    //QML支持black 等颜色样式(没有#)
    //QML支持#11cfff 等颜色样式
    //QML同样支持RGB格式
    flags:  Qt.Window  //窗口标志 说明是什么窗口 使用 | 分割,缺省为Qt.Window
    //Qt.Window 普通窗口模式,带标题栏
    //Qt.FramelessWindowHint 隐藏标题栏窗口
    opacity: 1 //透明度 数值区间为0~1 支持小数,缺省为1
    x:0 //位于父窗体的x位置,以左上角为起点,缺省为0 (此时window的父窗体就是桌面了)
    y:0 //位于父窗体的y位置,以左上角为起点,缺省为0 (此时window的父窗体就是桌面了)
}

无边框

Window {
    width: 640
    height: 480
    visible: true
    color: "#fefefe"
    title: qsTr("主页面")
    flags: "FramelessWindowHint"
}

显示标题栏,但是没有关闭最大最小化按钮

Window {
    width: 640
    height: 480
    visible: true
    color: "#fefefe"
    title: qsTr("主页面")
    flags: "CustomizeWindowHint"
}

背景透明无边框窗口

Window {
    width: 640
    height: 480
    visible: true
    color: "#00000000"
    title: qsTr("主页面")
    flags: Qt.FramelessWindowHint
    opacity:1
}

opacity这个属性是对当前组件以及子组件都设置不透明度,所以不太适用

color: Qt.rgba(0,0,0,0)是对当前设置透明度,不会传到子组件

组件

基本组件

 

这里面的这几个内部也可以填充其它组件

  • MouseArea
  • Rectangle

定位组件和布局管理器

 

定位器(Row、Column、Grid、Flow)

布局管理器(RowLayout、ColumnLayout、GridLayout、StackLayout)

Layout

要使用layout布局的属性 需要引用

import QtQuick.Layouts 1.12

示例1

一个简单的示例

横向分布,最后一个填充剩余空间。

import QtQuick 2.14
import QtQuick.Window 2.14
import QtQuick.Layouts 1.12

Window {
    width: 640
    height: 480
    visible: true
    color: "#f3f3f3"
    title: qsTr("主页面")

    RowLayout {
        id: row
        height: 200
        spacing: 0
        anchors.left:parent.left
        anchors.right:parent.right

        Rectangle {
            id: rectangle
            width: 200
            height: parent.height
            color: "red"
        }
        Rectangle {
            id: rectangle2
            width: 200
            height: parent.height
            color: "green"
        }
        Rectangle {
            id: rectangle3
            height: parent.height
            color: "blue"
            Layout.fillWidth: true
        }

    }
}

显示效果

 

其中

RowLayout {
    id: row
    height: 200
    spacing: 0
    anchors.left:parent.left
    anchors.right:parent.right
}

RowLayout {
    id: row
    height: 200
    width:parent.width
    spacing: 0
}

是等效的,前者就用了锚(anchors) 布局

只有在Layout相关的空间中才能使用Layout.fillWidth: true相关的属性。

所以RowLayout可以实现元素填充剩余空间,而Row是不可以的,除非我们复制宽度是通过计算的值。

代码如下

import QtQuick 2.14
import QtQuick.Window 2.14
import QtQuick.Layouts 1.12

Window {
    width: 640
    height: 480
    visible: true
    color: "#f3f3f3"
    title: qsTr("主页面")

    Row {
        id: row
        height: 200
        spacing: 0
        anchors.left:parent.left
        anchors.right:parent.right

        Rectangle {
            id: rectangle
            width: 200
            height: parent.height
            color: "red"
        }
        Rectangle {
            id: rectangle2
            width: 200
            height: parent.height
            color: "green"
        }
        Rectangle {
            id: rectangle3
            height: parent.height
            width: parent.width-rectangle.width-rectangle2.width
            color: "blue"
        }

    }
}

示例2

基本的事件和按钮按压变色及点击事件

import QtQuick 2.14
import QtQuick.Window 2.14
import QtQuick.Layouts 1.12

Window {
    width: 640
    height: 480
    visible: true
    color: "#f3f3f3"
    title: qsTr("主页面")

    MouseArea {
        width: 200
        height: 200
        anchors.centerIn: parent
        Rectangle {
            id:myrect
            anchors.fill: parent
            color: "blue"

            Text {
                text: "点击"
                color: "white"
                font.pixelSize: 16
                anchors.centerIn: parent
            }
        }
        onClicked: {
               console.log("区域点击")
        }

        onPressedChanged: {
            if(pressed){
                myrect.color="green"
            }else{
                myrect.color="blue"
            }
            console.log(pressed)
        }
    }

    Component.onCompleted: {
        console.log("加载完毕")
    }

}

Rectangle的事件

Rectangle {
    width: 600
    height: 400
    anchors.centerIn: parent
    color: "lightgray"
    TapHandler {
        //点击屏幕时,修改了pressed属性,触发onPressedChanged
        onPressedChanged: {
            console.log("press ? : ", pressed)
        }

        //长按时触发onLongPressed
        onLongPressed: {
            console.log("long pressed")
        }
    }
}

QML 信号与槽

方式1

对于 QML 中的属性如果其值发生改变, QML 自动会发生相关信号

on<Property>Changed 这种格式

举例:

MouseArea {
    onPressedChanged: console.log("value:" , pressed)
}

方式2

比较适合在同一个 QML 文件内

signal <name> (type parameter, type parameter)

on<Name>

例如:

signal testSignal(real x, real b)
testSignal(x, b) //执行 也就是 发送信号 类似 quick 中的 emit signal()

onTestSignal: console.log("xxx")// 槽 用于接收信号

举例:

Item {
    signal clickTest();
    
    MouseArea {
        onPressed: {
            clickTest()
        }
    }
     
    onClickTest: consloe.log("received")
}

方式3

适合一对多或者跨 QML 断开就使用 disconnect 就好 1 : 跟信号在同一个范围,可这么写

signal sendSignal();
MouseArea { 
    sendSignal()
}

Component.onCompleted: {
    sendSignal.connect(send21)
    sendSignal.connect(send22)
    sendSignal.connect(send23)
}

function send21() {
    console.log("1: received signal");
}

function send22() {
    console.log("2: received signal");
}

function send23() {
    console.log("3: received signal");
}

2:如果与信号不在同一范围

MyTest {
    signal testT()
    id : mytest
    MouseArea {
        onPressed: {
            mytest.testT()
        }
    }
}

Component.onCompleted: {
   mytest.testT.connect(send21)  // mytest.testT.disconnect(send21)
   mytest.testT.connect(send22)
   mytest.testT.connect(send23)
}

function send21() {
    console.log("1: received signal");
}

function send22() {
    console.log("2: received signal");
}

function send23() {
    console.log("3: received signal");
}

3、Connections 最主要的优势可以连接到没有定义在 QML 的东西 格式:

Connections {
    target: 信号的来源
    on<Signal>:
}
Connections {
    target: mytest
    onTestT: {
        send21();
    }
}

本文福利,费领取Qt开发学习资料包、技术视频,内容包括(C++语言基础,Qt编程入门,QT信号与槽机制,QT界面开发-图像绘制,QT网络,QT数据库编程,QT项目实战,QT嵌入式开发,Quick模块等等)↓↓↓↓↓↓见下面↓↓文章底部点击费领取↓↓

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

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

相关文章

(微信开发)Laya转发H5网页到微信,带图片

网页转发到微信时&#xff0c;带图片和自定义标题。2022年11月22号 关键解说 _wx.config({ debug: _wx_configdebug, appId: e.appId, timestamp: e.timestamp, nonceStr: e.nonceStr, signature: e.signature, jsApiList: [ // 所有要调用的 API 都要加到这个列表中 ‘onMen…

网络威胁情报git【全面】

开源地址如下: https://github.com/fastfire/deepdarkCTI 网络威胁情报 (CTI) 被定义为收集和分析有关威胁和对手的信息以及绘制模式&#xff0c;这些模式提供了针对各种网络攻击的准备、预防和响应行动做出明智决策的能力。 CTI 涉及收集、研究和分析网络威胁领域的趋势和技…

APP测试面试题汇总(基础篇、进阶篇)

一、基础篇 1、请介绍一下&#xff0c;APP测试流程&#xff1f; APP测试流程与web测试流程类似&#xff0c;分为如下七个阶段&#xff1a; 1.根据需求说明书编写测试计划&#xff1b; 2.制定测试方案&#xff0c;主要是测试任务、测试人员和测试时间的分配&#xff1b; 3.…

Elasticsearch GC优化实践

近期业务查询线上ES集群出现频繁超时告警&#xff0c;尤其是早晨某个时间点固定的报一波超时&#xff0c;从调用链监控上很难看出是什么业务行为导致的。 初步猜测 查看Grafana上Elasticsaerch的基础监控&#xff0c;发现业务告警与ES的Old GC&#xff08;老年代GC&#xff0…

功率放大器的参数和应用场景是什么

功率放大器是电子测量行业比较常见的一种电子放大器&#xff0c;主要目的是增加给定输入信号的功率幅度&#xff0c;使输入信号功率增加&#xff0c;从而驱动到发射器等输出设备的负载水平。和电流放大器与电压放大器有所不同的是&#xff0c;功率放大器是直接驱动负载并且最终…

SessionCookie

会话 会话&#xff1a;用户打开浏览器进行的一系列操作直至关闭浏览器的过程看作是一次会话 HTTP协议是无状态的&#xff0c;不能实现跟踪对话。比如进入一个网站&#xff0c;每次操作的请求之间相互独立&#xff0c;无法相互联系。也就是说你每次请求过后得到的服务器响应或…

web前端-javascript-基本语法(注释,常用语法,代码格式)

文章目录基本语法1. JS 注释2. 常用语法3. 代码格式基本语法 <!DOCTYPE html> <html><head><meta charset"utf-8" /><title></title><script type"text/javascript">/** 多行注释*///单行注释alert("hell…

学生学python编程---实现贪吃蛇小游戏+原码

学生学python编程---实现贪吃蛇小游戏原码前言主要设计1、蛇的表示2、蛇怎么移动&#xff1f;3、玩家控制小蛇移动功能的实现4、如何判定游戏结束&#xff1f;应用知识点1、python知识点1.1 列表append()在列表未尾增加一个元素del 删除最后一个元素在指定位置增加元素用insert…

vCenter命令行升级

1.为当前vCenter打快照 2.为vCenter关联新的iso镜像 3.SSH登录vCenter 4.检查ISO镜像 software-packages stage --iso software-packages list --staged 5.安装vCenter&#xff0c;安装预计40分钟 software-packages install --staged 6.重启vCenter Command>shell #re…

【论文】撰写小论文用到的资料

一、小论文算法的学习 &#xff08;一&#xff09;资料链接 1.联邦学习&#xff1a;https://www.baidu.com/s 2.迁移学习概述&#xff08;Transfer Learning&#xff09;https://blog.csdn.net/dakenz/article/details/85954548 3.迁移学习&#xff1a;经典算法解析&#xff…

前端怎么解决跨域

JSONP jsonp的原理就是利用<script>标签没有跨域限制&#xff0c;通过<script>标签src属性&#xff0c;将本地的全局函数通过callback传到服务器&#xff0c;服务端将接口返回数据拼凑到callback函数中&#xff0c;返回给客服端 实现思路 服务端的代码&#xff…

第七章 数学 AcWing 1533. 1 的个数

第七章 数学 AcWing 1533. 1 的个数 原题链接 AcWing 1533. 1 的个数 算法标签 数学 枚举 数位DP 思路 显然&#xff0c;直接暴力枚举时间复杂度 230(枚举N个数)∗10(枚举N个数每一位)≈10102^{30}(枚举N个数)*10(枚举N个数每一位)\approx10^{10}230(枚举N个数)∗10(枚举…

windows下通过远程桌面访问linux图形界面

一、安装epel库 epel库安装之前无法使用yum install xrdp命令安装xrdp 命令&#xff1a;yum install epel-release之后会自动匹配对应版本的rpm包&#xff0c;并解决依赖关系进行安装。 二、安装xrdp xrdp作为linux的图形化界面 1.命令&#xff1a;yum install xrdp2.开启…

【POJ No. 3368】 最频繁值 Frequent values

【POJ No. 3368】 最频繁值 Frequent values 北大OJ 题目地址 【题意】 给定n 个整数的非递减序列a 1 , a 2 ,…, an &#xff0c;对每个索引i 和j 组成的查询&#xff08;1≤i ≤j ≤n &#xff09;&#xff0c;都确定整数ai , …, aj 中的最频繁值&#xff08;出现次数最多…

Jmeter工具下载并直连MySQL数据库

优秀链接&#xff1a; Jmeter汉化 Jmeter初认识 前提有JDK&#xff0c;我的是1.8 下载Jmeter 下载的Jmeter版本是5.5无需配置Jmeter路径&#xff0c;下载后解压便可以运行 官网地址&#xff1a;https://jmeter.apache.org/download_jmeter.cgi 官网下载比较慢&#xff0c;在…

[附源码]计算机毕业设计JAVA健身健康规划系统

[附源码]计算机毕业设计JAVA健身健康规划系统 项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybati…

ADPCM(自适应差分脉冲编码调制)的原理和计算

关于ADPCM ADPCM(Adaptive Differential Pulse Code Modulation, 自适应差分脉冲编码调制) 是一种音频信号数字化编码技术, 音频压缩标准G.722, G.723, G.726 中都会使用到 ADPCM G.722 is an ITU-T standard 7 kHz wideband audio codec operating at 48, 56 and 64 kbit/s. …

【Linux】linux中,你不得不爱的命令集(下)

我们将要介绍的命令并不是linux中所有的命令&#xff0c;是我们常见的和经常要使用的命令。 我们所用的linux版本是centos7&#xff0c;我们的linux搭建是在腾讯云服务器上搭建的&#xff0c;借助Xshell登录服务器&#xff0c;在root下进行命令行的操作。 目录 mv指令&#x…

什么认证在云计算行业内的含金量最大?考试费用贵不贵?

作为一个新兴发展起来的技术&#xff0c;云计算在社会生产中的作用越来越重要&#xff0c;各家企业纷纷转型&#xff0c;希望能借用新技术&#xff0c;获得新的发展。这样一来市场就需要大量的新人才来维护运行&#xff0c;然而云计算作为新兴技术&#xff0c;还没有被大量引入…

野火FPGA入门(7):IP核调用

文章目录第24讲&#xff1a;快速开发的法宝&#xff1a;IP核第25讲&#xff1a;PLL-IP核的调用第26讲&#xff1a;ROM-IP核的调用rom_ctrl.vrom.v第27讲&#xff1a;RAM-IP核的调用key_filterram_crtlram第28讲&#xff1a;FIFO-IP核的调用同步FIFO异步FIFO第24讲&#xff1a;快…