我目前正在学习Qt,用Python和QML开发一个简单的桌面应用。关于 Pyside2
与 QML
竟然是不够的。
总之,现在我正在为用户自定义快捷键的注册而烦恼。
有些app有一个文本字段,你可以在其中按一个组合键,这个组合就会显示在文本字段中,类似这样的图片。
根据官方文件,有一个。QKeySequenceEdit
在C++中。
有什么方法可以在 QML
? 或者至少在 Pyside2
?
或者说QML从一开始就不是一个好的GUI选择?
更新
使用@folibis的答案的陌生字符
Ctrl+d`, Ctrl+c, Ctrl+v 从左到右。
更新2根据@folibis的回答,我最后写了下面的代码。
var keyModifiers = [
{"name": "Ctrl", "code": Qt.ControlModifier},
{"name": "Shift", "code": Qt.ShiftModifier},
{"name": "Alt", "code": Qt.AltModifier},
{"name": "Meta", "code": Qt.MetaModifier},
// {"name": "Keypad", "code": Qt.KeypadModifier},
{"name": "GroupSwitch", "code": Qt.GroupSwitchModifier}
]
var numpadKeycodes = [
{"name": "Del", "code": Qt.Key_Period},
{"name": "+", "code": Qt.Key_Plus},
{"name": "*", "code": Qt.Key_Asterisk},
{"name": "-", "code": Qt.Key_Minus},
{"name": "/", "code": Qt.Key_Slash},
{"name": "0", "code": Qt.Key_0},
{"name": "1", "code": Qt.Key_1},
...
]
var keycodes = [
...
{"name": "/", "code": Qt.Key_Question}, // ?
{"name": "2", "code": Qt.Key_At}, // @
{"name": "A", "code": Qt.Key_A},
{"name": "B", "code": Qt.Key_B},
{"name": "C", "code": Qt.Key_C},
....
]
TextField {
id: txt
readOnly: true
Keys.onPressed: {
var str = "";
var text;
keyModifiers.forEach(modifier => {
if(event.modifiers & modifier.code) {
str += `${modifier.name} + `;
}
});
// Numpad keys
if (event.modifiers & Qt.KeypadModifier) {
str += "Num "
text = numpadKeycodes.some(keycode => {
if (keycode.code === event.key) {
str += keycode.name;
return keycode.name
}
});
} else {
text = keycodes.some(keycode => {
if (keycode.code === event.key) {
str += keycode.name;
return keycode.name
}
});
}
if (str === "" && !text) {
str = "None"
}
txt.text = str;
}
Keys.onReleased: {
if (txt.text.endsWith(" ")) {
txt.text = "None"
}
}
}
工作完成了,但代码太多... ... 如果有更好的方法,请告诉我。
QML的好处是你可以很容易的做任何你想做的事情。至于你的问题,你可以实现类似下面的东西。
TextField {
id: txt
readOnly: true
anchors.centerIn: parent
Keys.onPressed: {
var str = '';
var arr = {
'Shift': Qt.ShiftModifier,
'Ctrl': Qt.ControlModifier,
'Alt': Qt.AltModifier,
'Meta': Qt.MetaModifier,
'Keypad': Qt.KeypadModifier,
'GroupSwitch': Qt.GroupSwitchModifier };
for(var key in arr) {
var value = arr[key];
if(event.modifiers & value) {
str += (str === '' ? '' : '-') + key;
}
}
if(event.text !== '')
str += (str === '' ? '' : '-') + event.text;
txt.text = str;
}
}