如何使用 keyPressEvent() 处理键盘快捷键?应该用它吗?

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

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()
进行比较。

所以真的没什么问题......

  1. Qt 文档中列出了所有键盘按键,因此可以使用它们进行

    e.text()=='keyboardKey'
    比较。

  2. 如何使用我正在使用的“技术”处理双键盘组合键(例如

    Ctrl+Key
    )(从视图的
    keyPressEvent()
    内部发送自定义信号?

  3. 是否有另一种更简单的方法来挂钩键盘按键来触发方法或功能(以便用户可以在鼠标位于

    QTableView
    上方时使用键盘快捷键来启动“操作”)?

python qt pyqt shortcut
3个回答
6
投票

如果您查看

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 语句将按顺序执行。


2
投票

为了完整起见,如果您想要更困难的序列(例如 ctrl-c 后跟 ctrl-k),只需使用 QKeySequence 作为 QAction 的快捷方式,可以将其添加到任何 QWidget


0
投票

只是为了完整性 - 事实证明,您可以直接将

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")
© www.soinside.com 2019 - 2024. All rights reserved.