本章将深入讲解QT Quick中6种最基础且常用的可视化组件,它们是构建交互式UI的核心基石。我们会从每个组件的属性、信号、方法及适用场景入手,结合QML代码示例,帮你快速掌握其使用精髓。
本章涉及的6个核心组件各有明确定位:
描述:最基础的交互组件,用于响应用户点击,触发提交表单、执行操作等特定功能。
核心属性:
核心信号:clicked()——按钮被点击时触发。
import QtQuick 2.15
import QtQuick.Controls 2.15
Button {
id: myButton
text: "点击我!"
width: 150
height: 50
// 自定义样式:实现点击、 hover时的颜色变化
background: Rectangle {
color: myButton.down ? "#CCCCCC" : (myButton.hovered ? "#E0E0E0" : "#F5F5F5")
border.color: "#2196F3"
radius: 8
}
onClicked: {
console.log("按钮被点击了!");
// 在此添加业务逻辑,如弹窗、数据提交等
}
}
描述:允许用户从一组选项中选择多个或全不选,代表选中/未选中的二进制状态;开启三态模式后支持半选状态,适合批量选择子项的场景。
核心属性:
核心信号:checkStateChanged()——选中状态改变时触发。
CheckBox {
id: agreeCheckBox
text: "我同意用户协议"
checked: false
// 如需三态模式,取消下方注释
// tristate: true
onCheckStateChanged: {
if (checked) {
console.log("用户已同意协议");
myButton.enabled = true; // 启用提交按钮
} else {
console.log("用户未同意协议");
myButton.enabled = false; // 禁用提交按钮
}
}
}
描述:用于在一组互斥选项中选择唯一答案,必须通过分组确保选项间的互斥性。
核心属性:
核心信号:toggled()——选中状态切换时触发。
// 方法1:使用Column/Row自然分组(隐式互斥,适合简单布局)
Column {
spacing: 10
RadioButton { text: "选项 A"; checked: true }
RadioButton { text: "选项 B" }
RadioButton { text: "选项 C" }
}
// 方法2:使用ButtonGroup(显式分组,更灵活,支持分散布局的单选按钮)
ButtonGroup {
id: colorGroup
buttons: colorColumn.children
}
Column {
id: colorColumn
RadioButton { text: "红色" }
RadioButton { text: "绿色"; checked: true }
RadioButton { text: "蓝色" }
}
描述:允许用户通过拖动滑块在连续或离散范围内选择数值,常用于音量调节、亮度设置等场景。
核心属性:
核心信号:valueChanged()——数值改变时触发。
Slider {
id: volumeSlider
from: 0.0
to: 1.0
value: 0.5
stepSize: 0.05
width: 200
// 实时显示当前音量百分比
onValueChanged: {
volumeText.text = "音量: " + Math.round(value * 100) + "%";
// 实际应用中可在此调用音频API设置音量
}
}
Text {
id: volumeText
text: "音量: 50%"
anchors.top: volumeSlider.bottom
}
描述:向用户展示耗时任务的完成进度,或表示不确定时长的等待状态,是提升用户体验的重要反馈组件。
核心属性:
提示:ProgressBar通常由后台逻辑驱动更新value,而Slider由用户交互直接控制。
// 确定进度模式(模拟下载进度)
ProgressBar {
id: downloadProgress
from: 0
to: 100
value: 0 // 初始进度为0
width: 300
// 用计时器模拟下载进度更新
Timer {
interval: 200
running: true
repeat: true
onTriggered: {
if (downloadProgress.value < 100) {
downloadProgress.value += 2;
}
}
}
}
// 不确定进度模式(用于等待未知时长的任务,如网络请求)
ProgressBar {
indeterminate: true
visible: someBusyCondition // 根据业务条件控制显示
}
描述:接收用户单行文本输入,适用于用户名、密码、搜索关键词等场景,支持输入验证与密码掩码。
核心属性:
核心信号:editingFinished()——编辑完成(焦点移出输入框)时触发。
// 用户名输入框(限制字母数字)
TextField {
id: usernameField
width: 200
placeholderText: "请输入用户名"
// 正则验证:只允许字母和数字
validator: RegExpValidator { regExp: /[a-zA-Z0-9]+/ }
onEditingFinished: {
console.log("输入的用户名是:", text);
// 可在此执行用户名查重、格式校验等操作
}
}
// 密码输入框(掩码显示)
TextField {
id: passwordField
width: 200
placeholderText: "请输入密码"
echoMode: TextInput.Password // 用圆点掩码密码
// 可搭配Button实现密码显示/隐藏切换功能
}
我们将上述组件组合,打造一个模拟“应用设置”面板,展示组件间的协同工作方式:
import QtQuick 2.15
import QtQuick.Controls 2.15
import QtQuick.Layouts 1.15
Rectangle {
width: 400
height: 500
color: "#F5F5F5"
border.color: "#CCCCCC"
radius: 10
ColumnLayout {
anchors.fill: parent
anchors.margins: 20
spacing: 15
// 标题
Text { text: "应用程序设置"; font.bold: true; font.pixelSize: 20; Layout.alignment: Qt.AlignHCenter }
// 1. 用户名输入区域
Text { text: "用户名:" }
TextField {
id: username
Layout.fillWidth: true
placeholderText: "输入新用户名"
}
// 2. 通知选项(多选)
Text { text: "通知设置:" }
CheckBox { text: "启用声音通知"; checked: true }
CheckBox { text: "显示桌面提醒" }
CheckBox { text: "邮件通知" }
// 3. 主题选择(单选)
Text { text: "主题颜色:" }
Column {
RadioButton { text: "浅色主题"; checked: true }
RadioButton { text: "深色主题" }
RadioButton { text: "自动切换" }
}
// 4. 音量控制滑块
Text { text: "提示音量:" }
Slider {
id: volumeSlider
Layout.fillWidth: true
from: 0; to: 100; value: 60
}
Text { text: "当前音量: " + Math.round(volumeSlider.value); Layout.alignment: Qt.AlignRight }
// 5. 保存设置与进度展示
Button {
text: "保存设置"
Layout.alignment: Qt.AlignHCenter
onClicked: {
saveProgress.visible = true;
saveTimer.start(); // 启动模拟保存计时器
}
}
ProgressBar {
id: saveProgress
Layout.fillWidth: true
visible: false
from: 0; to: 100; value: 0
}
// 模拟保存进度的计时器
Timer {
id: saveTimer
interval: 50
repeat: true
onTriggered: {
if (saveProgress.value < 100) {
saveProgress.value += 5;
} else {
stop();
saveProgress.visible = false;
console.log("设置保存完成!");
saveProgress.value = 0; // 重置进度
}
}
}
}
}
优秀的UI设计不仅是组件的简单摆放,更要贴合用户意图,通过合适的组件与流畅的交互逻辑满足需求。下一章我们将探索更复杂的QT Quick可视化组件。