1、Window:根
1 | import QtQuick |
所有的子类必须写在根类下
错误示例:
1 | import QtQuick |
2、id:唯一标识
id开头字母必须小写
1 | Window { |
3、property:自定义属性
1 | Rectangle { |
常用属性:
| 类型名称 | 描述 | 示例/说明 |
|---|---|---|
| int | 32位有符号整数,范围-2147483648 ~ 2147483647 | property int loops: 5 |
| color | ARGB颜色值,支持字符串、名称或Qt.rgba() | color: "#FF0000" 或 color: "red" 或 color: Qt.rgba(1,0,0,1) |
| font | 字体类型,含pixelSize、family、bold等属性 | font { pixelSize: 20; family: "Arial" } |
| bool | 布尔类型,值true或false | property bool isVisible: true |
| string | Unicode字符串 | property string name: "QML" |
| real | 双精度浮点数(默认)或单精度(需配置) | property real ratio: 3.14 |
| double | 双精度浮点数 | property double ratio: 3.14 |
| date | 日期类型 | property date today: new Date() |
| var | 通用类型,可存储任意值 | property var dynamicValue: "Hello" |
| point | 二维坐标点 (x, y) | property point pos: Qt.point(100, 200) |
| rectangle | 矩形区域 (x, y, width, height) | property rect bounds: Qt.rect(0, 0, 100, 50) |
| list | QML对象列表(需结合对象类型) | property list<Rectangle> items: [Rectangle {}, Rectangle {}] |
3.1、default property:默认属性
1 | Rectangle { |
3.2 readonly property:只读属性
不可被修改
1 | Rectangle { |
3.3、required property:需要属性
必须赋值,否则程序无法运行
1 | Rectangle { |
4、x、y、z:偏移属性
父控件最左上角为原点
1 | Rectangle { |
所以此处显示的矩形为黄色
5、visible:是否隐藏
1 | Rectangle { |
6、scale:缩放等级
1 | Rectangle { |
7、rotation:旋转度数
1 | Rectangle { |
8、opcaity:透明度
1 | Rectangle { |
9、clip:是否裁剪
限制子控件的范围不超过父控件本身
1 | Rectangle { |
10、children:子控件
在QML早期语法中,子控件会加上children标识
现在不需要了
1 | Rectangle { |
11、anchors:锚布局
锚布局必须给某一个控件加上唯一id
1 | Rectangle { |
12、parent:父控件标识
1 | Window { |
13、radius:圆角属性
Qt6中可以给左上角、右上角、左下角、右下角单独设置圆角属性:topRightRadius、bottomRightRadius等
Qt5则需要clip或一些其他方法
1 | Window { |
14、border:边框属性
1 | Rectangle { |
15、Text:文本控件
1 | Item { |
换行需要配合除了Window以外的父控件使用
16、TextField:文本输入框控件
Qt6需要导入import QtQuick.Controls.Basic
Qt5需要导入import QtQuick.Controls 2.15
1 | TextField { |
readOnly属性可以设置不可写入
cursorVisible属性可以设置光标隐藏
16.1、background:背景设置
1 | TextField { |
16.2、placeholderText:文本提示
1 | TextField { |
16.3、horizontalAlignment:文本居中
1 | TextField { |
16.4 echoMode: 设置输入模式
1 | TextField { |
16.5、selectByMouse:是否可被鼠标选中
1 | TextField { |
16.6、maximumLength:限制字符最大长度
1 | TextField { |
16.7、padding:内边距
leftPadding、rightPadding、topPadding、bottomPadding
1 | TextField { |
17、TextArea:多行文本输入框控件
1 | TextArea { |
18、Image:图片控件
1 | Image { |
19、事件系统
| 事件类型 | 描述 | 使用场景 | 示例 |
|---|---|---|---|
| Mouse Events | 处理鼠标相关的事件,包括点击、移动、进入、离开等。 | 按钮点击、鼠标悬停、拖拽操作等。 | onClicked, onPressed, onReleased, onEntered, onExited |
| Keyboard Events | 处理键盘相关的事件,包括按键按下、释放等。 | 输入框输入、快捷键触发等。 | onPressed, onReleased, onTextChanged |
| Focus Events | 处理焦点相关的事件,包括获得焦点和失去焦点。 | 表单输入时切换输入框焦点等。 | onFocusChanged, onActiveFocusChanged |
| Touch Events | 处理触摸相关的事件,适用于触摸屏设备。 | 触摸滑动、缩放等手势操作。 | onTouchStarted, onTouchUpdated, onTouchEnded |
| Wheel Events | 处理鼠标滚轮事件。 | 滚动视图内容、缩放操作等。 | onWheel |
| Drag Events | 处理拖拽相关的事件。 | 拖拽文件、元素等。 | onDragEntered, onDragMoved, onDragDropped, onDragExited |
| Hover Events | 处理鼠标悬停相关的事件。 | 按钮或元素悬停时的视觉反馈。 | onHovered, onUnhovered |
| Component Events | 处理组件生命周期相关的事件。 | 组件加载、销毁等。 | onCompleted, onDestruction |
| State Changes | 处理状态变化相关的事件。 | 界面状态切换,如从正常状态切换到编辑状态。 | onStateChanged |
| Property Changes | 处理属性变化相关的事件。 | 当某个属性值发生变化时触发相应操作。 | onPropertyNameChanged (例如 onWidthChanged, onColorChanged) |
| Timer Events | 处理定时器相关的事件。 | 定时执行某个操作,如自动刷新数据。 | onTriggered |
| Animation Events | 处理动画相关的事件。 | 动画开始、结束、暂停等。 | onRunningChanged, onStopped, onStarted |
| Input Method Events | 处理输入法相关的事件。 | 处理输入法输入,如中文输入法的联想词等。 | onInputMethodComposing, onInputMethodCommitted |
| Context Menu Events | 处理上下文菜单相关的事件。 | 右键菜单显示、选择等。 | onContextMenuRequested |
| Window Events | 处理窗口相关的事件。 | 窗口大小改变、关闭、最小化等。 | onClosing, onVisibilityChanged, onActiveChanged |
| Application Events | 处理应用程序级别的事件。 | 应用启动、退出等。 | onApplicationStarted, onApplicationStopped |
1 | //拖拽事件区域 |
20、Button:按钮控件
1 | Button { |
21、DelayButton:延时按钮
1 | DelayButton { |
22、Switch:开关控件
1 | Switch { |
23、RadioButton:单选按钮
1 | RadioButton { |
24、ButtonGroup:按钮组
1 | ButtonGroup { |
25、Popup:弹出框控件
1 | Button { |
关闭策略:
| 策略 | 描述 |
|---|---|
| Popup.NoAutoClose | 该弹窗仅当显式调用关闭指令时才会关闭。 |
| Popup.CloseOnPressOutside | 当鼠标点击弹窗外部区域时,弹窗将关闭。 |
| Popup.CloseOnPressOutsideParent | 当鼠标点击父控件外部区域时,弹窗将关闭。 |
| Popup.CloseOnReleaseOutside | 当鼠标按键在弹窗外部区域释放时,弹窗将关闭。 |
| Popup.CloseOnReleaseOutsideParent | 当鼠标按键在父控件外部区域释放时,弹窗将关闭。 |
| Popup.CloseOnEscape | 当弹窗拥有活动焦点时按下 Esc 键,弹窗将关闭。 |
26、Dialog:对话框控件
Qt6中已经移除了Dialog中的flags、modality等属性
1 | Button { |
27、FileDialog:文件对话框控件
1 | Button { |
28、FolderDialog:文件夹对话框控件
1 | Button { |
29、ColorDialog:颜色选择对话框控件
1 | Button { |
30、FontDialog:字体选择对话框控件
1 | Button { |
31、MessageDialog:消息对话框控件
1 | Button { |
32、states:状态属性
1 | Rectangle { |
33、transitions:过渡动画属性
和状态是绑定的,从一种状态过渡到另一种状态
1 | Rectangle { |
34、PropertyAnimation:动画属性
PropertyAnimation可以单独写(手动触发),
也可以直接写到控件内部(一渲染就执行),
或transition中(state控制)
1 | Button { |
35、Behavior:预设行为动画
1 | Rectangle { |
36、ParallelAnimation:并行动画
1 | ParallelAnimation { |
36、SequentialAnimation:串行动画
1 | SequentialAnimation { |
37、ScriptAction:动画执行结束脚本
1 | SequentialAnimation { |
38、gradient:渐变属性
1 | Rectangle { |
39、LinearGradient:线性渐变(Qt5)
需要导入import QtGraphicalEffects 1.15
qt6导入import Qt5Compat.GraphicalEffects,需要安装模块
1 | Rectangle { |
40、ConicalGradient:锥形渐变(Qt5)
不仅可以作用到矩形,还可以作用到图片
设置旋转动画等
1 | // Rectangle { |

41、RadialGradient:辐射渐变(Qt5)
1 | Rectangle { |


42、BrightnessContrast:亮度与饱和度
1 | Image { |
43、Slider:滑块控件
1 | Text { |
44、Colorize:着色HSL
1 | Colorize { |
45、Desaturate:饱和度
1 | Desaturate { |
46、GammaAdjust:伽马矫正
GammaAdjust根据预定义的幂律曲线应用于每个像素,其中gamma属性被用作缩放指数的倒数。更多细节请参阅gamma属性的文档说明。
注:在QML的GammaAdjust元素中,该处理实质是通过公式output = input ^ (1.0 / gamma)实现伽马校正,gamma属性控制着输入像素值的非线性变换强度。
1 | GammaAdjust { |
47、HueSaturation:着色HSL叠加
1 | HueSaturation { |
48、FastBlur:快速模糊
1 | Image { |
49、GaussianBlur: 高斯模糊
1 | Image { |
50、RecursiveBlur:递归模糊
1 | Image { |
51、MaskedBlur:遮罩模糊
1 | Image { |
52、DirectionalBlur:路径模糊
1 | Image { |
53、RadialBlur:镜像模糊
1 | Image { |
54、ZoomBlur:缩放模糊
1 | Image { |
55、ColorOverlay:颜色叠加
1 | Image { |
56、Blend:图片叠加
1 | Image { |
57、DropShadow:投影
1 | Rectangle { |
58、InnerShadow:内阴影
1 | Rectangle { |
59、Glow:发光
1 | Rectangle { |
60、RectangleGlow:内发光
1 | Rectangle { |
61、ListView:视图、代理、模型
视图:listview
代理:定义视图中的每一条数据该长什么样子
模型:代指数据:listmode
1 | //定义模型 |
cacheBuffer: int – 为了节省内存,超出视图范围的数据是不渲染的,通过设置缓存n条数据到内存,可以优化滚动性能
62、布局系统
62.1、Row:行布局
1 | Row { |
62.2、Column:列布局
1 | Column { |
62.3、Grid:网格布局
1 | Grid { |
62.4、RowLayout:适应窗口的行布局
1 | RowLayout { |
62.5、ColumnLayout:适应窗口的列布局
1 | ColumnLayout { |
62.6、GridLayout:适应窗口的网格布局
1 | GridLayout { |
63、自定义控件
自定义控件的文件名首字母必须大写
main.qml
1 | //不同级的文件需要手动引入 |
MyButton.qml
1 | import QtQuick 2.15 |
controls/MyrRect.qml
1 | import QtQuick 2.15 |
64、C++访问qml控件
64.1、访问window根节点控件
注意导入:QQmlProperty
1 |
|
64.2、访问子控件
1 | //寻找window的子控件,findChild需要指定模板为QObect*,传入控件的objectName |
子控件Rectangle需要给定objectName属性值
1 | Window { |
64.3、访问信号
1 | //调用obj(window)的信号sig |
qml声明并绑定信号
1 | //声明信号 |
64.4、信号或函数传参以及返回值
1 | //调用obj(window)的函数sig |
qml定义函数
1 | //定义函数 |
64.5、qml信号连接c++槽
新建testQmlSignal类,继承Object,创建槽函数testSlot
1 | public slots: |
连接信号与槽
1 | testQmlSignal* test = new testQmlSignal; |
65、qml访问c++类的属性和方法
65.1 属性
需要包含QQmlContext头文件
1 |
|
qml中text显示
1 | Rectangle { |
65.2 方法
声明属性和方法
1 | public: |
方法实现
1 | int testQmlSignal::getPro2() const |
注册成qml控件,需要在引擎加载之前注册
1 | //将testQmlSignal注册成控件并导入qml文件 |
qml中使用
1 | import TestQmlSignal 1.0 |
66、WorkScript多线程异步处理数据
qml实现
1 | //js脚本 |
workscript的source实现
1 | WorkerScript.onMessage = function func(msg) { |
多线程异步
非多线程异步
67、MouseArea鼠标穿透
一次只能传递一层
1 | MouseArea { |
点击事件的信号从second Rect穿透到了first Rect,由于只传递了一层,所以window MouseArea没有生效
68、Flickable与Scrollbar:使区域可滚动
1 | Flickable { |
69、Repeater:单个控件多次重复
1 | Repeater { |
当model为单属性列表时可以通过modelData访问数据,以及通过index访问当前model值
70、qml自定义信号
定义信号,单独文件
1 | QtObject { |
连接信号
1 | Connections { |
71、Canvas:画图控件
1 | Canvas { |
72、StackView:多页面切换和返回上一个页面
1 | // 存储页面,可以前后切换 |
重要:以stakview显示的页面都会沿用其设置的大小,所以子页面的根节点无需设置大小
73、ComboBox:下拉单选框
1 | ComboBox { |
注意:自定义字体样式时,注意text属性指向comboBox的自定义text
74、进阶自定义组件
74.1、窗体拖拽
1 | MouseArea { |
74.2、字体分割+字体渐变
1 | //包裹整个文字的大Item |
74.3、轮播图1
1 | Item { |
74.4、轮播图2
1 | Item { |
说些什么吧!