如何在 Qt 中的 keyPressEvent 上获取没有修饰符的按键?

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

考虑这个 PySide 6 示例:

from PySide6.QtCore import *  # noqa
from PySide6.QtGui import *  # noqa
from PySide6.QtWidgets import *  # noqa


class TableWidget(QTableWidget):
    def __init__(self):
        super().__init__()
        self.setColumnCount(2)
        self.setHorizontalHeaderLabels(["Key", "Value"])
        self.setColumnWidth(1, 800)
        self._sequence_format = QKeySequence.PortableText
        self._modifier_order = [
            self.modifier_to_string(modifier)
            for modifier in (Qt.ControlModifier, Qt.AltModifier, Qt.ShiftModifier)
        ]

    def modifier_to_string(self, modifier):
        return QKeySequence(modifier.value).toString(self._sequence_format).lower()

    def key_to_string(self, key):
        if key in (
            Qt.Key_Shift,
            Qt.Key_Control,
            Qt.Key_Alt,
            Qt.Key_Meta,
            Qt.Key_AltGr,
        ):
            return None
        else:
            return QKeySequence(key).toString(self._sequence_format).lower()

    def shortcut_from_event(self, event):
        key = event.key()
        modifiers = event.modifiers()
        vk = event.nativeVirtualKey()
        key_string = self.key_to_string(key)
        vk_string = self.key_to_string(vk)
        modifier_strings = tuple(
            self.modifier_to_string(modifier) for modifier in modifiers
        )
        shortcut_tpl = (key_string, modifier_strings)

        shortcut_lst = []
        for modifier_string in self._modifier_order:
            if modifier_string in shortcut_tpl[1]:
                shortcut_lst.append(modifier_string)
        shortcut_lst.append(shortcut_tpl[0])
        if None in shortcut_lst:
            shortcut = None  # noqa
        else:
            shortcut = "".join(shortcut_lst)  # noqa

        return {
            "shortcut": shortcut,
            "key": key,
            "modifiers": modifiers,
            "vk": vk,
            "key_string": key_string,
            "vk_string": vk_string,
            "modifier_strings": modifier_strings,
        }

    def keyPressEvent(self, event):
        table = self
        item = self.shortcut_from_event(event)

        if item:
            table.clearContents()
            table.setRowCount(0)

            row_position = 0
            for k, v in sorted(item.items(), reverse=True):
                table.insertRow(row_position)
                table.setItem(row_position, 0, QTableWidgetItem(k))
                table.setItem(row_position, 1, QTableWidgetItem(str(v)))
            # table.resizeColumnsToContents()

        # return super().keyPressEvent(event)


if __name__ == "__main__":
    import sys

    app = QApplication(sys.argv)
    w = TableWidget()
    w.resize(800, 600)
    w.show()
    sys.exit(app.exec())

我想知道:如何使用modifier_order后面的修饰符和不受影响的键字符串创建快捷方式字符串?例如,现在:

  • 如果我按+

  • 如果我按 Shift + +

  • 如果我按 AltGr + +

但我想修改代码,以便创建的快捷方式将分别为 +Shift + plusCtrl + Alt + plus

我怎样才能实现这种行为?与所有键类似,我想获取未受影响的键的字符串,顶部没有任何修饰符。

python qt key keyboard-shortcuts pyside6
1个回答
0
投票

来自 QT 文档

警告:此功能并不总是可信。例如,用户可以通过同时按下两个 Shift 键并释放其中一个键来混淆它。

建议的替代方案是使用应用程序本身的键盘修饰符。

按照这个答案,这种方法似乎确实效果更好。所以,在你的情况下只需切换这条线

modifiers = event.modifiers()
这个:

modifiers = Qt.QtWidgets.QApplication.keyboardModifiers()
我还建议您将 QT 类型映射到 

shortcut

 元组中您自己的可读字符串,以产生所需的输出值

希望这有帮助

© www.soinside.com 2019 - 2024. All rights reserved.