QML:如何注册用户自定义快捷方式?

问题描述 投票:0回答:1

我目前正在学习Qt,用Python和QML开发一个简单的桌面应用。关于 Pyside2QML 竟然是不够的。

总之,现在我正在为用户自定义快捷键的注册而烦恼。

有些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 pyside2
1个回答
0
投票

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;
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.