考虑这个 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 + plus 和 Ctrl + Alt + plus。
我怎样才能实现这种行为?与所有键类似,我想获取未受影响的键的字符串,顶部没有任何修饰符。
来自 QT 文档
警告:此功能并不总是可信。例如,用户可以通过同时按下两个 Shift 键并释放其中一个键来混淆它。
建议的替代方案是使用应用程序本身的键盘修饰符。
按照这个答案,这种方法似乎确实效果更好。所以,在你的情况下只需切换这条线
modifiers = event.modifiers()
这个:
modifiers = Qt.QtWidgets.QApplication.keyboardModifiers()
我还建议您将 QT 类型映射到 shortcut
元组中您自己的可读字符串,以产生所需的输出值希望这有帮助