【问题标题】:How to handle keyboard shortcuts using keyPressEvent()? And should it be used for it?如何使用 keyPressEvent() 处理键盘快捷键?它应该用于它吗?
【发布时间】:2015-01-28 22:58:52
【问题描述】:

在从QTableViewkeyPressEvent() 方法中定义自定义信号发射时:

def keyPressEvent(self, e):
    if e.text()=='w':
        self.emit(SIGNAL('writeRequested'))
    if e.text()=='o':
        self.emit(SIGNAL('openRequested')) 

我正在使用传入的e 参数来确定按下了哪个键盘键。使用这种“技术”,我当时只能使用一个角色。其次,我无法使用Ctrl+KeyAlt+KeyShift+Key 的组合。第三,我不知道DeleteBackspaces 键是什么,所以我可以将它们与e.text() 进行比较。

所以问题真的很少......

  1. 在 Qt 文档中列出了所有键盘键的位置,因此它们可用于进行 e.text()=='keyboardKey' 比较。

  2. 如何使用我正在使用的“技术”处理双键盘组合键(例如Ctrl+Key)(从视图的keyPressEvent() 内部发送自定义信号?

  3. 是否有其他更简单的方法来挂钩键盘键以触发方法或功能(这样用户可以在鼠标位于QTableView 上方时使用键盘快捷键来启动“动作”)?

【问题讨论】:

    标签: python qt pyqt shortcut


    【解决方案1】:

    如果您查看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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-02-05
        • 2010-10-11
        • 2012-01-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多