跳至主要內容

Qt

LincZero大约 11 分钟

Qt

目录

QML 基本使用

基本语法

  • QML文档
    • 由import部分和对象声明部分组成
  • 对象和属性
    • 每个QML文档有且只有一个根对象、对象可以嵌套子对象
    • 对象:由他们的类型指定,以大写字母开头
    • 属性:以键值对的形式给出
  • 对象标识符
    • 每个对象都可以指定一个唯一的id值,id值在同一个qml文档必须唯一
    • 例如:id: mouseArea
  • 属性别名
    • alias关键字声明属性别名
    • 作用:能使用外部QML文档也能通过别名访问到该对象
    • 格式:property alias 别名: 属性名,其中右侧的属性名一般是id
    • 例如:property alias mouseArea: mouseArea
  • 注释
    • 同C/C++、JavaScript,单行注释//、多行注释/**/

QML常用组件(设计师界面有的)

设计师界面的Components窗口中默认是你QML代码中已经 import 了的模块,如果你没有import模块,则就是空的

My Components(自定义组件) 是你自定义组件了之后(可能还需要重置代码模型)就会显示的

除此之外,你可以通过该窗口右上叫的 “+” 号,附加一些其他的自带组件(附加以后你的QML代码就会出现相应的 import 代码),有:

[[Module Name]]						// 界面名
									// 其中 QtQuick 这个基本上是必加的,而且要通过代码加,用设计师界面加可能会出bug
									// 1. My Components
import QtQuick 2.15					// 2. Default Components(默认组件)
import QtQuick.Controls 6.2			// 6. QtQuick Controls
import QtQuick.Layouts 6.0			// 7. QtQuick Layouts
import QtCharts 6.2					// 3. QtCharts
import QtDataVisualization 1.3		// 4. QtDataVisualization
import QtMultimedia 6.0				// 5. QtMultimedia
import QtQuick.Controls.Windows 6.0	// 8. QtQuick Controls Windows
import QtQuick.Window 2.14			// 9. QtQuick Window

My Components(自定义组件)

使用方式

默认只有

  • (1) 新建一个qml文件,在里面封装qml组件,如取名Button.qml
  • (2) 在主qml文件中复用他,直接Button{/*...*/}即可,像使用QML基本元素一样去使用
  • (3) 注意在复用会可以重写属性以覆盖自定义组件中的属性

可能会标红错误:Unknown component,但是不会影响正常运行

解决方法:菜单 工具 > QML/JS > 重置代码模型

使用示例:

Button.qml(组件)

import QtQuick 2.0
 
Rectangle {
    id: root
 
    property alias text: label.text		// 为了不对外暴露Text元素,我们给了它的text属性一个别名
    signal clicked						// MouseArea的clicked()
 
    width: 116; height: 26
    color: "lightsteelblue"
    border.color: "slategrey"
 
    Text {
        id: label
        anchors.centerIn: parent
        text: "Start"
    }
    MouseArea {
        anchors.fill: parent
        onClicked: {
            root.clicked()
        }
    }
}

main.qml(使用上面那个组件)

import QtQuick 2.0
 
Rectangle {
    width: 360
    height: 360
    Button {
        id: button
        x: 12; y: 12
        text: "Start"
        onClicked: {
            status.text = "Button clicked!"
        }
    }
 
    Text {
        id: status
        x: 12; y: 76
        width: 116; height: 26
        text: "waiting ..."
        horizontalAlignment: Text.AlignHCenter
    }
}

其他组件 %tx

主类别次类别翻译
My Components
自定义组件
..
Default Components
默认组件
Basic (11)
基本
Animated Image动画图片
^^^^Border Image边框图片
^^^^Flickable可拖拽的?
^^^^Focus Scope聚焦区域
^^^^Image图片
^^^^Item
^^^^Mouse Area鼠标区域
^^^^Rectagle矩形
^^^^Text文本文字
^^^^Text Edit单行输入
^^^^Text Input多行输入
^^View (3)
视图
Grid View网格视图
^^^^List View列表视图
^^^^Path View路径视图
^^Positioner (4)
定位
Column纵向
^^^^Row横向
^^^^Flow
^^^^Grid网格
^^Animation (9)
动画
Color Animation颜色动画
^^^^Number Animation数字动画
^^^^Parallel Animation平行动画
^^^^Pause Animation停顿动画
^^^^Property Action属性行为
^^^^Property Animation属性动画
^^^^Script Action脚本行为
^^^^Sequential Animation序列动画
^^^^Timer计时器
^^Component (3)
组件
QtCharts
图表
Qt Charts - ChartView (12)
一般坐标
^^Qt Charts - PolarChartView (4)
极坐标
QtDataVisualization
数据可视化
.
QtMultimedia
多媒体
.
QtQuick Controls
QC
.
QtQuick Layouts
布局
.
QtQuick Controls Window
QC窗口
..
QtQuick Window
Quick窗口
..

%toTable|主类别|次类别|项

  • My Components
    自定义组件
  • Default Components
    默认组件
    • Basic (11)
      基本
      • Animated Image
      • Border Image
      • Flickable
      • Focus Scope
      • Image
      • Item
      • Mouse Area
      • Rectagle
      • Text
      • Text Edit
      • Text Input
    • View (3)
      视图
      • Grid View
      • List View
      • Path View
    • Positioner (4)
      定位
      • Column
      • Row
      • Flow
      • Grid
    • Animation (9)
      动画
      • Color Animation
      • Number Animation
      • Parallel Animation
      • Pause Animation
      • Property Action Property Animation
      • Script Action
      • Sequential Animation
      • Timer
    • Component (3)
      组件
  • QtCharts
    图表
    • Qt Charts - ChartView (12)
      一般坐标
    • Qt Charts - PolarChartView (4)
      极坐标
  • QtDataVisualization
    数据可视化
  • QtMultimedia
    多媒体
  • QtQuick Controls
    QC
  • QtQuick Layouts
    布局
  • QtQuick Controls Window
    QC窗口
  • QtQuick Window Quick窗口
主类别次类别翻译
My Components
自定义组件
..
Default Components
默认组件
Basic (11)
基本
Animated Image动画图片
^^^^Border Image边框图片
^^^^Flickable可拖拽的?
^^^^Focus Scope聚焦区域
^^^^Image图片
^^^^Item
^^^^Mouse Area鼠标区域
^^^^Rectagle矩形
^^^^Text文本文字
^^^^Text Edit单行输入
^^^^Text Input多行输入
^^View (3)
视图
Grid View网格视图
^^^^List View列表视图
^^^^Path View路径视图
^^Positioner (4)
定位
Column纵向
^^^^Row横向
^^^^Flow
^^^^Grid网格
^^Animation (9)
动画
Color Animation颜色动画
^^^^Number Animation数字动画
^^^^Parallel Animation平行动画
^^^^Pause Animation停顿动画
^^^^Property Action属性行为
^^^^Property Animation属性动画
^^^^Script Action脚本行为
^^^^Sequential Animation序列动画
^^^^Timer计时器
^^Component (3)
组件
QtCharts
图表
Qt Charts - ChartView (12)
一般坐标
^^Qt Charts - PolarChartView (4)
极坐标
QtDataVisualization
数据可视化
.
QtMultimedia
多媒体
.
QtQuick Controls
QC
.
QtQuick Layouts
布局
.
QtQuick Controls Window
QC窗口
..
QtQuick Window
Quick窗口
..

QML 可视化元素

奇怪的地方

  • QML绘制矩形、图像、文字时,拖拽窗口大小会使这些可视化元素变形

一些通用属性

  • 基本属性
    • x,水平位置
    • y,垂直位置
    • width,宽度
    • height,高度
    • opacity,透明度(0~1)
    • scale,缩放(0~1)
    • radius,圆角大小
    • border{},边框
  • Anchor 常用属性
    • 锚线:left、horizontalCenter、right、top、verticalCenter、bottom、(Text的baseline)
    • 边距:anchor.margins、leftMargin、rightMargin、topMargin、bottomMargin
    • 偏移:offset、horizontalCenterOffset、verticalCenterOffset、baselineOffset
    • 填充:anchors.fill,等价于使用4个anchors.top: parent.top这样的语法
  • onClicked,单击的回调函数

Rectangle 矩形

  • gradient:Gradient{/**/},以垂直方向的渐变色填充矩形

使用例程

import QtQuick 2.7
import QtQuick.Window 2.2
Rectangle{
    property alias mouseArea: mouseArea		// 属性别名
    property alias topRect: topRect
    width:360								// 宽度
    height:360								// 高度
    MouseArea{
        id:mouseArea						// 对象标识符
        anchors.fill:parent					// 布局,填满父对象
    }
    mouseArea.onClicked: {
        topRect.visible = !topRect.visible	// 控制第二个方块是否显示
    }
    /* 添加定义两个Rectangle对象 */
    Rectangle{
        rotation:45
        x:40
        y:60
        width:100
        height:100
        color:"red"							// 颜色
    }
    Rectangle{
        id:topRect
        opacity:0.6
        scale:0.8
        x:135
        y:60
        width:100
        height:100
        radius:8							// 圆角
        gradient:Gradient{					// 以垂直方向的渐变色填充矩形
            GradientStop{position:0.0; color:"aqua"}
            GradientStop{position:1.0; color:"teal"}
        }
        border{width:3; color:"blue"}
    }
}

![image-20210816194543036](02.%20QML 基本使用.assets/image-20210816194543036.png)

Image 图像

  • fileMode,填充模式
    • Image.Streth,拉伸
    • Image.PreserveAspecFit,等比缩放
    • Image.PreserceAspectCrop,等比缩放 最大化填充 必要时裁剪图片
    • Image.Tile,瓷砖平铺
    • Image.TileVertivally,垂直平铺
    • Image.TileHorizontally,水平平铺
    • Image.Pad,不作变换

使用例程

import QtQuick 2.7
Rectangle{		// 矩形
	Image{                                      // 图片
        x:0
        y:0
        width:977/4; height:1248/4
        source: "21.jpeg"						// 图片源,要先添加进qrc资源里
        fillMode: Image.PreserveAspectCrop      // 填充模式
        clip:true                               // 避免渲染的图片超出元素范围
    }
}

Text 文本

  • text,文本内容
    • "Hello Qt Quick",普通文本
    • "<b>Hello</b> <i>Qt Quick!</i>",富文本内容
  • style,样式
    • text.Normal,普通
    • Text.Outline,描边
    • Text.Raised,凸起
    • Text.Sunken,凹陷
  • styleColor,样式颜色
  • elide
    • Text.ElideNone,默认不省略
    • Text.ElideRight,从右侧省略
  • wrapMode
    • Text.WrapAnywhere,以字母为界换行
    • Text.WordWrap,以单词为界换行

使用例程

Text{                                       // 【普通纯文本】
    x:0
    y:360
    color:"green"                           // 颜色
    font.family: "Helvetica"                // 字体
    font.pointSize:24                       // 字号
    text:"Hello Qt Quick"                   // 内容
}
Text{                                       // 【html富文本】
    x:0;y:400;color:"green";font.family: "Helvetica";font.pointSize:24;text:"Hello Qt Quick"
    text:"<b>Hello</b> <i>Qt Quick!</i>"    // 富文本内容
}
Text{                                       // 【带样式的文本】
    x:0;y:440;color:"green";font.family: "Helvetica";font.pointSize:24;text:"Hello Qt Quick"
    style:Text.Outline;                     // 文本样式 - 描边
    styleColor: "blue"                      // 文本样式 - 颜色(覆盖color)
}
Text{                                       // 【带缩略的文本】
    x:0;y:480;color:"green";font.family: "Helvetica";font.pointSize:24;text:"Hello Qt Quick"
    width:200                               // 限制文本宽度
    horizontalAlignment:Text.AlignLeft      // 窗口中左对齐
    verticalAlignment: Text.AlignTop        // 窗口中顶对齐
    elide:Text.ElideRight                   // 省略文本,从右侧省略
}
Text{                                       // 【换行的文本】
    x:0;y:520;color:"green";font.family: "Helvetica";font.pointSize:24;text:"Hello Qt Quick"
    width:200                               // 限制文本宽度
    horizontalAlignment:Text.AlignLeft      // 窗口中左对齐
    wrapMode: Text.WrapAnywhere             // 换行模式,哪怕在单词中间,若以单词为界则Text.WordWrap
}

QML 元素布局

Positioner(定位器)

Row(行定位)

行列定位的用法差不多

Row{
    x:25
    y:25
    spacing:10						// 元素间距多少px
    layoutDirection:Qt.RightToLeft	// 从右向左排列
    // 以下添加被定位的元素成员
    RedRectangle{}
    GreenRectangle{}
    BlueRectangle{}
}

Column(列定位)

行列定位的用法差不多

Column{
    x:25
    y:25
    spacing:2						// 元素间距多少px
    // 以下添加被定位的元素成员
    RedRectangle{}
    GreenRectangle{}
    BlueRectangle{}
}

Grid(网格定位)

Grid{
    x:25
    y:25
    columns:3						// 每行3个元素,或者也可以设置rows属性
    // rows:3
    spacing:5						// 元素间距多少px
    // 以下添加被定位的元素成员
    BlueRectangle{}
    BlueRectangle{}
    BlueRectangle{}
    BlueRectangle{}
    BlueRectangle{}
}

Flow(流定位)

与Row、Column等定位器不同的是,里面的元素会根据窗体尺寸动态地调整其布局

Flow{
    anchors.fill:parent
    anchors.margins:15				// 元素与窗口左上角边距为15px
    spacing:5						// 元素间距多少px
    // 以下添加被定位的元素成员
    RedRectangle{}
    GreenRectangle{}
    BlueRectangle{}
}

Repeater(重复器,与其他定位器结合使用)

Grid{
    x:25
    y:25
    spacing:5						// 元素间距多少px
    // 以下添加被定位的元素成员
    Repeater{						// 重复器
        model:16					// 要创建元素成员的个数
        Rectangle{					// 成员
            Text{					// 显示矩形的编号
                text:index			// Repeater会为每个子元素注入一个index属性
            }
        }
    }
}

Anchor(锚)

  • 锚线概念
    • 每个元素都可被认为有一组无形的 “锚线”
    • 元素的6条锚线:left、horizontalCenter、right、top、verticalCenter、bottom
    • Text元素还有一个baseline锚线
  • 锚线属性
    • 这些锚线分别对应元素中的 anchors.left、anchors.horizontalCenter、等属性
    • 所有的可视化元素都可以使用锚线来布局
  • 注意事项
    • 只能在父子或兄弟之间使用锚,且不能与绝对位置(设置x和y)混合使用
  • Anchor 常用属性
    • 锚线:left、horizontalCenter、right、top、verticalCenter、bottom、(Text的baseline)
    • 边距:anchor.margins、leftMargin、rightMargin、topMargin、bottomMargin
    • 偏移:offset、horizontalCenterOffset、verticalCenterOffset、baselineOffset
    • 填充:anchors.fill,等价于使用4个anchors.top: parent.top这样的语法
    • anchors.centerIn

QML 事件处理

MouseArea 鼠标事件

MouseArea 可以响应鼠标事件的区域,作为子对象它可以使用parent关键字访问其父对象

需要注意qml后声明元素会覆盖前声明元素,包括点击区域

  • mouseArea.onClicked: {/**/},鼠标单击事件的回调函数
  • drag 拖拽对象属性
    • drag.target,被拖拽的元素id
    • drag.active,获取元素当前是否正在被拖拽
    • drag.axis,指示拖拽的方向
      • Drag.XAxis、Drag.YAxis、Drag.XandYAxis
    • drag.minimumX,拖拽最小范围
    • drag.maximumX,拖拽最大范围
  • acceptedButtons,能接受的鼠标键
  • mouse 鼠标事件对象属性
    • mouse.button,按下的按钮
    • mouse.modifiers,鼠标的修饰键
  • 键的媒体值
    • Qt.LeftButton、Qt.RightButton、Qt.ShiftModifier
Rectangle{
    width:50                            // 宽度
    height:50                           // 高度
    color:"teal"                        // 颜色:蓝绿
    opacity:(360.0-x)/360				// 透明度,且随拖拽而改变
    MouseArea{
        anchors.fill:parent             // 布局,填满父对象
        /* 拖拽属性设置 */
        drag.target: parent             // 指定被拖拽的元素的id
        //drag.active                   // 获取元素当前是否正在被拖拽
        drag.axis:Drag.XAxis            // 指示拖拽的方向(YAxis、XandYAxis)
        drag.minimumX: 0                // 拖拽最小范围
        drag.maximumX: 360-parent.width // 拖拽最大范围
        acceptedButtons: Qt.LeftButton | Qt.RightButton // 能接受的鼠标键
        onClicked: {                    // 鼠标事件。mouse为鼠标事件对象,可获取xy位置和按下的按键
    		// 右击则缩小
            if(mouse.button == Qt.RightButton){
                parent.color = "blue"
                parent.width -= 5
                parent.height -= 5
            }
			// shift右击则重设大小。mouse.modifiers获取修饰键
            else if((mouse.button == Qt.LeftButton) && (mouse.modifiers & Qt.ShiftModifier)){
                parent.color = "teal"
                parent.width = 50
                parent.height = 50
            }
			// 左击则放大,这里有个bug:在右边缘放大会突破位移限制
            else{
                parent.color = "green"
                parent.width += 5
                parent.height += 5
            }
        }
    }
}

键盘事件

  • KeyNavigation 对象属性,可以用来实现使用方向键或Tab键来进行元素的导航,属性设置为要将焦点转移到的id
    • KeyNavigation.tab、backtab
    • down、left、right、up
    • priority
  • Keys 对象属性,一般与focus属性配合使用,只有当focus为true时它才起作用
    • Keys.onUpPressed,上方向键
    • Keys.onDownPressed,上方向键
    • Keys.onLeftPressed,上方向键
    • Keys.onRightPressed,上方向键
  • focus,是否获取焦点(true/false)

输入控件和焦点

QML有两个输入控件:TextInput 和 TextEdit

需要注意的是,他们与QLineEidt不同,没有一个可视化显示(边框等),只有一个闪动的光标和用户输入的文本,通常需要一些可视化修饰

TextInput 单行文本输入

TextInput{
    id: input
    anchors.fill: parent
    anchors.margins: 4
    focus: true
    text: "请输入内容..."
}

TextEdit 多行文本编辑

使用几乎完全相同