Keys 附加属性是 QML 中处理键盘交互的主要方式,可以附加到任何 Item 上。
基本属性
属性 | 类型 | 默认值 | 说明 |
---|---|---|---|
forwardTo |
list | [] |
将键盘事件转发给其他项目 |
enabled |
bool | true |
是否启用键盘处理 |
关键信号
信号 | 参数 | 说明 |
---|---|---|
onPressed(KeyEvent event) |
event : 键盘事件对象 |
按键按下时触发 |
onReleased(KeyEvent event) |
event : 键盘事件对象 |
按键释放时触发 |
onShortcutOverride(KeyEvent event) |
event : 键盘事件对象 |
快捷键冲突时触发 |
KeyEvent 对象详解
主要属性
属性 | 类型 | 说明 |
---|---|---|
key |
int | 按键代码(如 Qt.Key_A) |
text |
string | 实际输入的字符 |
modifiers |
flags | 修饰键状态(如 Ctrl/Shift) |
isAutoRepeat |
bool | 是否自动重复触发 |
count |
int | 重复次数 |
accepted |
bool | 是否已处理该事件 |
常用按键代码
按键常量 | 值 | 对应按键 |
---|---|---|
Qt.Key_0 - Qt.Key_9 |
48-57 | 数字键0-9 |
Qt.Key_A - Qt.Key_Z |
65-90 | 字母键A-Z |
Qt.Key_Left |
0x01000012 | 左箭头 |
Qt.Key_Right |
0x01000014 | 右箭头 |
Qt.Key_Up |
0x01000013 | 上箭头 |
Qt.Key_Down |
0x01000015 | 下箭头 |
Qt.Key_Enter |
0x01000005 | 回车键 |
Qt.Key_Return |
0x01000004 | 返回键 |
Qt.Key_Escape |
0x01000000 | ESC键 |
Qt.Key_Space |
0x20 | 空格键 |
Qt.Key_Tab |
0x01000001 | Tab键 |
Qt.Key_Backspace |
0x01000003 | 退格键 |
Qt.Key_Delete |
0x01000007 | 删除键 |
修饰键标志
修饰键常量 | 值 | 说明 |
---|---|---|
Qt.NoModifier |
0x00000000 | 无修饰键 |
Qt.ShiftModifier |
0x02000000 | Shift键 |
Qt.ControlModifier |
0x04000000 | Ctrl键 |
Qt.AltModifier |
0x08000000 | Alt键 |
Qt.MetaModifier |
0x10000000 | Meta键(Windows键) |
焦点管理
关键属性
属性 | 类型 | 默认值 | 说明 |
---|---|---|---|
focus |
bool | false |
是否接受键盘焦点 |
activeFocus |
bool | false |
只读,是否实际拥有焦点 |
KeyNavigation.tab |
Item | null |
Tab键导航目标 |
KeyNavigation.backtab |
Item | null |
Shift+Tab导航目标 |
KeyNavigation.up |
Item | null |
上箭头导航目标 |
KeyNavigation.down |
Item | null |
下箭头导航目标 |
KeyNavigation.left |
Item | null |
左箭头导航目标 |
KeyNavigation.right |
Item | null |
右箭头导航目标 |
焦点相关方法
方法 | 参数 | 返回值 | 说明 |
---|---|---|---|
forceActiveFocus() |
- | - | 强制获取焦点 |
nextItemInFocusChain() |
- | Item | 获取焦点链中下一个项目 |
实用代码示例
基本按键处理
qml
import QtQuick 2.15
Item {
width: 200; height: 200
focus: true
Keys.onPressed: {
switch(event.key) {
case Qt.Key_Left:
console.log("左箭头按下");
break;
case Qt.Key_Right:
console.log("右箭头按下");
break;
case Qt.Key_Space:
console.log("空格键按下");
break;
}
// 检查组合键
if ((event.key === Qt.Key_S) && (event.modifiers & Qt.ControlModifier)) {
console.log("Ctrl+S 保存操作");
event.accepted = true;
}
}
}
焦点链管理
qml
import QtQuick 2.15
import QtQuick.Controls 2.15
Column {
spacing: 10
TextField {
id: field1
placeholderText: "第一个输入框"
KeyNavigation.tab: field2
}
TextField {
id: field2
placeholderText: "第二个输入框"
KeyNavigation.tab: field3
KeyNavigation.backtab: field1
}
Button {
id: field3
text: "按钮"
KeyNavigation.backtab: field2
Keys.onReturnPressed: console.log("按钮被回车激活")
}
}
快捷键处理
qml
Item {
focus: true
// 处理复制快捷键
Keys.onShortcutOverride: {
if (event.matches(StandardKey.Copy)) {
event.accepted = true
}
}
Keys.onPressed: {
if (event.matches(StandardKey.Copy)) {
console.log("执行复制操作")
event.accepted = true
}
}
}
高级键盘处理
全局快捷键
qml
import QtQuick 2.15
import QtQuick.Window 2.15
Window {
width: 400; height: 300
visible: true
Item {
anchors.fill: parent
focus: true
// F11全屏切换
Keys.onPressed: {
if (event.key === Qt.Key_F11) {
visibility === Window.FullScreen ?
showNormal() : showFullScreen()
}
}
}
}
按键序列检测
qml
Item {
property var keySequence: []
focus: true
Keys.onPressed: {
keySequence.push(event.key)
if (keySequence.length > 3) keySequence.shift()
// 检测上上下下左右左右BA
if (keySequence.length === 8 &&
keySequence[0] === Qt.Key_Up &&
keySequence[1] === Qt.Key_Up &&
keySequence[2] === Qt.Key_Down &&
keySequence[3] === Qt.Key_Down &&
keySequence[4] === Qt.Key_Left &&
keySequence[5] === Qt.Key_Right &&
keySequence[6] === Qt.Key_Left &&
keySequence[7] === Qt.Key_Right) {
console.log("Konami code detected!")
keySequence = []
}
}
}
虚拟键盘集成
qml
import QtQuick 2.15
import QtQuick.VirtualKeyboard 2.15
ApplicationWindow {
id: window
width: 800
height: 600
TextField {
anchors.centerIn: parent
width: 200
placeholderText: "点击输入..."
}
InputPanel {
id: keyboard
anchors.bottom: parent.bottom
anchors.left: parent.left
anchors.right: parent.right
visible: Qt.inputMethod.visible
}
}
键盘交互最佳实践
明确的焦点指示:为获得焦点的项目提供视觉反馈
合理的Tab顺序:确保逻辑化的焦点导航顺序
平台一致性:遵循目标平台的快捷键惯例
无障碍支持:确保所有功能都能通过键盘访问
性能优化:避免在按键事件中进行重操作
错误处理:为无效输入提供反馈
文档说明:为复杂快捷键提供使用说明