在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 docs中,列出了所有keyboardKeys,以便它们可以用来进行e.text()=='keyboardKey'
比较。
如何使用"技术处理双键盘键组合(例如Ctrl+Key
)"我正在使用(从视图keyPressEvent()
内部发送自定义信号?
是否有另一种更简单的方法来挂钩键盘键以触发方法或功能(因此用户可以使用键盘快捷键,而鼠标位于QTableView
上方以启动"操作&# 34;?)
答案 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 }}