在
QTableView
的 keyPressEvent()
方法中定义自定义信号发射时:
def keyPressEvent(self, e):
if e.text()=='w':
self.emit(SIGNAL('writeRequested'))
if e.text()=='o':
self.emit(SIGNAL('openRequested'))
我正在使用传入的
e
参数来确定按下了哪个键盘键。通过这种“技术”,我当时只能扮演一个角色。其次,我无法使用 Ctrl+Key
、Alt+Key
或 Shift+Key
的组合。第三,我不知道 Delete
和 Backspaces
键是什么,所以我可以将它们与 e.text()
进行比较。
所以真的没什么问题......
Qt 文档中列出了所有键盘按键,因此可以使用它们进行
e.text()=='keyboardKey'
比较。如何使用我正在使用的“技术”处理双键盘组合键(例如
Ctrl+Key
)(从视图的keyPressEvent()
内部发送自定义信号?是否有另一种更简单的方法来挂钩键盘按键来触发方法或功能(以便用户可以在鼠标位于
QTableView
上方时使用键盘快捷键来启动“操作”)?keyPressEvent()
的签名,您会发现您在问题中描述的 e
参数属于 QKeyEvent
类型。
QKeyEvent
实例有一个方法key()
,它返回一个可以与枚举中的常量匹配的整数Qt.Key
。
例如:
if e.key() == Qt.Key_Backspace:
print 'The backspace key was pressed'
同样,
QKeyEvent
有一个方法modifiers()
。因为可以同时按下多个键盘修饰键,所以您需要稍微不同地使用它。 modifiers()
的结果是 Qt.KeyboardModifier
枚举中的一个或多个常量的二元或。要测试是否按下给定的修饰符,您需要执行二进制 AND。例如:
if e.modifiers() & Qt.ShiftModifier:
print 'The Shift key is pressed'
if e.modifiers() & Qt.ControlModifier:
print 'The control key is pressed'
if e.modifiers() & Qt.ShiftModifier and e.modifiers() & Qt.ControlModifier:
print 'Ctrl+Shift was pressed'
注意:在上面的示例中,如果同时按下 ctrl+shift,则所有三个 if 语句将按顺序执行。
为了完整起见,如果您想要更困难的序列(例如 ctrl-c 后跟 ctrl-k),只需使用 QKeySequence 作为 QAction 的快捷方式,可以将其添加到任何 QWidget。
只是为了完整性 - 事实证明,您可以直接将
QKeyEvent类型的
e
参数与 QKeySequence 进行比较,我在 https://code.qt.io/cgit/qt/qtbase.git/ 中看到了它树/src/widgets/dialogs/qmessagebox.cpp?h=5.15 :
void QMessageBox::keyPressEvent(QKeyEvent *e)
{
...
if (e == QKeySequence::Copy) {
...
事实证明,它在 PyQt5 中也适用 - 只是不要使用
e.key()
进行比较,而是直接使用 e
进行比较:
def keyPressEvent(self, e):
#if e.key() == Qt.Key_Q:
if e == QKeySequence.Copy:
print("QKeySequence.Copy")