如何在qt中的keyPressEvent上获取不带修饰符的按键?

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

考虑这个 pyside6 示例:

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+plus”和“ctrl+alt+plus”

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

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

当然,我很乐意提供帮助!您似乎正在尝试创建一个以表格格式显示键盘快捷键的 Qt 应用程序。您希望快捷键遵循特定的修饰符顺序并包含未受影响的键本身,从而创建可读的字符串。因此,我对您的代码进行了一些更改以实现此行为。

这是修改后的代码以及我所做更改的解释(如下):

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

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 = [
            Qt.ControlModifier,
            Qt.AltModifier,
            Qt.ShiftModifier,
        ]

    def modifier_to_string(self, modifier):
        return QKeySequence(modifier).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)

        shortcut_lst = []

        for modifier in self._modifier_order:
            if modifier & modifiers:
                shortcut_lst.append(self.modifier_to_string(modifier))
        
        if key_string:
            shortcut_lst.append(key_string)

        shortcut = "+".join(shortcut_lst)

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

    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)))

        super().keyPressEvent(event)

if __name__ == "__main__":
    import sys

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

变更和说明:

  1. 我更新了

    _modifier_order
    列表以包含实际的修饰符值(
    Qt.ControlModifier
    等),这使得代码更清晰。

  2. shortcut_from_event
    方法中,我简化了构建快捷方式字符串的过程。我迭代
    _modifier_order
    ,检查修饰符是否存在,并将相应的修饰符字符串附加到
    shortcut_lst
    。然后,我将未受影响的密钥字符串(如果可用)添加到列表中。最后,我加入列表以创建最终的
    shortcut
    字符串。

  3. 我删除了快捷方式列表中对

    None
    不必要的处理。

  4. 我在

    super().keyPressEvent(event)
    方法末尾添加了
    keyPressEvent
    ,以确保事件的默认行为仍被执行。

这应该为您提供使用指定的修饰符顺序和不受影响的键字符串创建快捷方式字符串的所需行为。希望有帮助:)

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