考虑这个 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+plus”和“ctrl+alt+plus”
我怎样才能实现这种行为?与所有键类似,我想获取未受影响的键的字符串,顶部没有任何修饰符
当然,我很乐意提供帮助!您似乎正在尝试创建一个以表格格式显示键盘快捷键的 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())
变更和说明:
我更新了
_modifier_order
列表以包含实际的修饰符值(Qt.ControlModifier
等),这使得代码更清晰。
在
shortcut_from_event
方法中,我简化了构建快捷方式字符串的过程。我迭代 _modifier_order
,检查修饰符是否存在,并将相应的修饰符字符串附加到 shortcut_lst
。然后,我将未受影响的密钥字符串(如果可用)添加到列表中。最后,我加入列表以创建最终的 shortcut
字符串。
我删除了快捷方式列表中对
None
不必要的处理。
我在
super().keyPressEvent(event)
方法末尾添加了 keyPressEvent
,以确保事件的默认行为仍被执行。
这应该为您提供使用指定的修饰符顺序和不受影响的键字符串创建快捷方式字符串的所需行为。希望有帮助:)