前言
QT Quick 和 Qt widgets 这两种技术,官方是强推 QT Quick 的。
QT Quick中布局一般有如下四种方式,
【资料图】
绝对布局很好理解,给值就显示,但是不灵活;
anchors 实际上是 Item 的一个属性集
Row 则是一个单独的 Item ,专门用来管理其它 Item 的,后面介绍的几种布局,也是类似的。
锚(anchors) 布局的参数:
//左上右下对齐anchors.left : AnchorLineanchors.top : AnchorLineanchors.right : AnchorLineanchors.bottom : AnchorLine//Marginanchors.leftMargin : realanchors.topMargin : realanchors.rightMargin : realanchors.bottomMargin : realanchors.margins : real//基线对齐及偏移anchors.baseline : AnchorLineanchors.baselineOffset : realanchors.mirrored : boolanchors.fill : Item//居中与偏移anchors.centerIn : Itemanchors.horizontalCenter : AnchorLineanchors.verticalCenter : AnchorLineanchors.horizontalCenterOffset : realanchors.verticalCenterOffset : real
其中
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.14import QtQuick.Window 2.14import QtQuick.Layouts 1.12Window { 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.14import QtQuick.Window 2.14import QtQuick.Layouts 1.12Window { 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.14import QtQuick.Window 2.14import QtQuick.Layouts 1.12Window { 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
举例:
MouseArea { onPressedChanged: console.log(\"value:\" , pressed)}
方式2
比较适合在同一个 QML 文件内
signal (type parameter, type parameter)on
例如:
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:}
Connections { target: mytest onTestT: { send21(); }}
【领 QT开发教程 学习资料, 点击下方链接莬费领取↓↓ ,先码住不迷路~】
点击这里:
关键词:
-
横着长的智齿一定要拔吗_横着长的智齿需要拔吗
1、横长的智齿需要拔掉。因为智齿是最后萌出的牙齿,而且由于人在咀嚼
-
公司停电放假通知(停电放假通知)_环球热议
司停电放假通知,停电放假通知这个问题很多朋友还不知道,来为大家解答
-
环球即时看!哪里有高清电影下载网站(哪里有高清电影下载)
导读1、想法论坛HDTVHDCHINA,一点点高清高清专区等。这些都是不错的高
-
百度ar导航(百度ar)
来为大家解答以上问题,百度ar导航,百度ar很多人还不知道,现在让我们
-
考不上高中最好的出路 都可以是干什么 世界快消息
选择上“3+2大专班”或“五年一贯制大专班”。部分省市有中专学校和高
-
全球要闻:A股半导体公司减持进行时,中微公司董事长已减持套现逾1亿
“CPO教主”剑桥科技股东继续减持。
-
当前时讯:涉案金额1400余万元!上海警方成功侦破医美产品领域妨害药品管理案
近日,上海市公安局食药环侦总队牵头虹口分局等13家分局,深入推进“昆
-
海得控制:拟以12.78亿元收购行芝达75%股权
海得控制(002184)6月8日晚间公告,公司拟以发行股份及支付现金的方式购
-
2023年5月新能源汽车销量预估解读,中国车企当仁不让扛把子_天天热消息
要说当前的销量之王,那么比亚迪绝对是当之无愧的扛把子,根据4月份新
-
微速讯:中国有多少军舰是奇瑞造的(中国有多少军舰)
来为大家解答以上的问题。中国有多少军舰是奇瑞造的,中国有多少军舰这
-
夕阳朝乾是什么意思_夕阳朝乾的意思是
夕阳朝乾是什么意思,夕阳朝乾的意思是很多人还不知道,现在让我们一起
-
养老金上调2023最新方案公布:不是人人都涨,事关你的钱袋子
养老金上涨消息在5月22日就给出了确定的方案,自此养老金19连涨落定。
-
中工漫评丨线上线下同台竞技,共赴数字之约
决赛期间,同步举办线上比武,包含焊接设备操作工—机器人、建筑信息模
-
龙虎榜 | 中船科技今日涨5.66% 知名游资宁波桑田路卖出4059.56万元 天天精选
中船科技今日涨5 66%,龙虎榜数据显示,上榜营业部席位全天成交4 44亿
-
今日热讯:快手科技刘震:全球短视频用户渗透率尚不足20%,出海是新机遇
作为全球排名第二的短视频和直播平台,快手已经覆盖了拉美、东南亚、中
-
泰国国会下议院选举47个选举点将重新计票
中新社曼谷6月8日电据泰国媒体报道,泰国选举委员会7日发布决议称,5月
-
【天天报资讯】临港新片区与7家QFLP试点管理企业签署合作备忘录
6月8日下午,中国(上海)自由贸易试验区临港新片区管理委员会在第十四
-
焦点速读:新款宝马X5预计9月国产化,内外设计再进化!
近日,公告君从网上获取了一组新款宝马X5(参数|询价)的申报实拍图,新
-
唐高宗李治将妹妹以皇后礼入葬?专家看到墓穴壁画后感慨:真狠! 环球速递
唐高宗李治将妹妹以皇后礼入葬?专家看到墓穴壁画后感慨:真狠!,唐朝
-
环球聚焦:自闭症的孩子是什么原因导致的_自闭症孩子是怎么造成的
1、社会心理学因素近来研究发现,不良的生活环境或不恰当的教育方式可