要在 Slint 中处理键盘输入,请使用 FocusScope 与 KeyBinding 元素,或在各种元素中使用单独的 key-pressed 和 key-released 回调。 键盘输入通过 KeyEvent 数据结构传递。 此数据结构的主要字段是 text 属性,它以字符串形式保存所有受影响的键。 使用 Key 命名空间 来标识已知的命名键。
请参阅 键绑定 部分,了解如何使用 Slint 的 KeyBinding 元素以及由 @keys 宏构造的内置 keys 类型以声明式方式处理键绑定。
KeyEvent
此结构由 FocusScope 元素的按键和释放回调生成并传递。
text(string):所按下键的 Unicode 表示。modifiers(KeyboardModifiers):按键事件发生时所激活的键盘修饰键。repeat(bool):对于重复的按键事件(即按住某个键)该字段设置为 true。对于释放事件它始终为 false。
键绑定
在 FocusScope 中使用 KeyBinding 元素 来声明键绑定(或键盘快捷键)。 KeyBinding 的 keys 属性接受 keys 类型 的一个实例,并在检测到按键组合时调用 activated 回调。
keys 类型表示一个与修饰键组合的键,使用 @keys 宏构造。
Slint 中的键绑定基于逻辑键——按键在当前键盘布局上所产生的字符——而非键的物理位置。 这意味着,例如 @keys(Control + Z) 会在用户按下其布局上产生 z 的按键时激活,无论该键在键盘上的位置如何。 因此,数字键盘上的数字键与主行的数字键无法区分,且 AltGr 不能作为修饰键使用(它会被操作系统用于产生字符)。
@keys(..) 宏接受 Key 命名空间 中的一个键,与以下任意修饰键组合:
Meta(macOS 上的 ⌃ control,PC 上的 Windows 键)Control(macOS 上的 ⌘ command)ShiftAlt(macOS 上的 ⌥ option)
export component Example inherits Window { forward-focus: scope;
scope := FocusScope { KeyBinding { keys: @keys(Control + Q); activated => { debug("Quit shortcut activated"); } }
KeyBinding { keys: @keys(Control + S); activated => { debug("Save shortcut activated"); } }
Text { text: scope.has-focus ? "Press Control + Q or Control + S" : "Click to focus"; } }}Caution
歧义的 KeyBinding 元素的行为当前未定义, 例如当两个或多个 KeyBinding 声明相同的 keys 时。
如果可能,会在编译时检测冲突。在运行时检测到的歧义键绑定将记录警告。
不同的键盘布局
对于来自 Key 命名空间 的键,@keys(..) 宏会自动处理不同的键盘布局。 例如,无论何时用户按下在其布局上产生 + 的键,@keys(Control + Plus) 都会触发——在 US 布局上需要 Shift + =,而在德语布局上 + 有自己的键,不需要 Shift。
@keys(..) 中的命名键是逻辑上的:A 表示字符 a,而不是 QWERTY 键盘上的特定物理键位置。这意味着无论该键在键盘上的位置如何,@keys(Control + A) 都将在用户布局上产生 a 的按键上激活。
如果你需要定义涉及 Key 命名空间 之外按键的键绑定,请继续阅读下一节,其中涵盖了高级键定义。
高级键绑定
如果可能,请优先在 @keys(..) 中使用 Key 命名空间 中的键。 如果你确实需要将绑定定义为不同的键,可以在 @keys(..) 宏中使用字符串字面量。 例如:@keys(Control + "ä")。
但请注意,在这种情况下 @keys(..) 宏不再自动处理不同的键盘布局和 Shift 行为。 提供的字符串将仅与小写的 text 以及给定 KeyEvent 的修饰键进行匹配。
为防止某些字符在应用 Shift(或在 macOS 上有时是 Alt)时完全改变其键码而引起的问题,你可以使用尾部的 ? 将这些修饰键标记为可选,例如:
Shift?Alt?
当修饰键被标记为可选时,keys 在匹配时会忽略相应修饰键的状态。
例如,要支持产生欧元符号(€)的键绑定,可同时添加 Shift? 和 Alt?:@keys(Control + Shift? + Alt? + "€")。 这将允许你的用户在几乎所有具有此标签键的键盘布局上触发该绑定。
再举一个例子,@keys(Control + Plus) 等价于 @keys(Control + Shift? + "+")。
Key 命名空间
Key 命名空间包含一系列众所周知的逻辑键码(包括任何不可打印的字符)。 此命名空间中的键名通过它们所产生的字符而非物理位置来标识键。 例如,Key.A 表示字符 a,而不是 QWERTY 键盘左上角的字母键。
请注意,字母键(例如 Key.A-Key.Z)以小写表示(例如 "a"-"z")。 请根据需要将 KeyEvent 的 text 或 Key 进行大小写转换。
BackspaceTabReturnEscapeBacktabDeleteShiftControlAltAltGrCapsLockShiftRControlRMetaMetaRSpaceUpArrowDownArrowLeftArrowRightArrowF1F2F3F4F5F6F7F8F9F10F11F12F13F14F15F16F17F18F19F20F21F22F23F24InsertHomeEndPageUpPageDownScrollLockPauseSysReqStopMenuBackABCDEFGHIJKLMNOPQRSTUVWXYZDigit0Digit1Digit2Digit3Digit4Digit5Digit6Digit7Digit8Digit9CircumflexExclamationDoubleQuoteHashDollarPercentAmpersandUnderscoreOpenParenCloseParenAsteriskPlusPipeHyphenMinusOpenCurlyBracketCloseCurlyBracketTildeColonSemicolonLessThanEqualsGreaterThanQuestionMarkAtCommaPeriodSlashBackQuoteOpenBracketBackSlashCloseBracketQuote