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

时间:2015-01-28 22:58:52

标签: python qt pyqt shortcut

QTableView keyPressEvent()方法中定义自定义信号发射时:

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 docs中,列出了所有keyboardKeys,以便它们可以用来进行e.text()=='keyboardKey'比较。

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

  3. 是否有另一种更简单的方法来挂钩键盘键以触发方法或功能(因此用户可以使用键盘快捷键,而鼠标位于QTableView上方以启动"操作&# 34;?)

2 个答案:

答案 0 :(得分:5)

如果您查看keyPressEvent()的签名,您会看到您在问题中描述的e参数类型为QKeyEvent

QKeyEvent个实例有一个方法key(),它返回一个可以与枚举Qt.Key中的常量匹配的整数。

例如:

if e.key() == Qt.Key_Backspace:
    print 'The backspace key was pressed'

同样,QKeyEvent有一个方法modifiers()。因为可以同时按下多个键盘修改器,所以您需要稍微使用它。 modifiers()的结果是Qt.KeyboardModifier枚举中一个或多个常量的二进制OR。要测试是否按下了给定的修改器,您需要执行二进制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语句按顺序执行。

答案 1 :(得分:1)

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