2013-03-26 41 views
2

我正在使用pyqt的Qshortcut试图检测组合键来触发某些动作,即当用户输入到QtextEdit小部件时,我想打印“更改模式”。 我已经看到,涉及CTRL + E或其他一些Ctrl或Shift键 组合其他按键顺序的例子,检测键序列

self.shcut1 = QtGui.QShortcut(self) 
    self.shcut1.setKey("CTRL+E") 
    self.connect(self.shcut1, QtCore.SIGNAL("activated()"), self.close) 

但我真的想陷阱- >(连字符后面是大于号)。有关如何做到这一点的任何建议

+0

你可能有兴趣在这个帖子里面讨论如何处理多个键按下:http://stackoverflow.com/questions/7176951/how-to-get-multiple-key-印刷机功能于单一事件/ 10568233#10568233 – Paul 2013-03-27 20:55:20

回答

1

QShortCut只接受QtCore.Qt::KeyboardModifiers的组合。尝试使用事件过滤器:

#!/usr/bin/env python 
#-*- coding:utf-8 -*- 

from PyQt4 import QtGui, QtCore 

class MyWindow(QtGui.QTextEdit): 
    modeChanged = QtCore.pyqtSignal(bool) 
    _seenMinus = False 
    def __init__(self, parent=None): 
     super(MyWindow, self).__init__(parent) 

     self.installEventFilter(self) 

     self.modeChanged.connect(self.on_modeChanged) 

    def on_modeChanged(self): 
     print "Changing Mode." 

    def eventFilter(self, obj, event): 
     if event.type() == QtCore.QEvent.KeyPress: 
      if event.key() == QtCore.Qt.Key_Minus: 
       self._seenMinus = True 

      elif event.key() == QtCore.Qt.Key_Greater \ 
      and event.modifiers() == QtCore.Qt.ShiftModifier \ 
      and self._seenMinus: 
       self.modeChanged.emit(True) 
       self.setStyleSheet(""" 
        background-color: lightgray; 
       """) 

      elif event.modifiers() != QtCore.Qt.ShiftModifier: 
       if self._seenMinus == True: 
        self.modeChanged.emit(False) 
        self._seenMinus = False 
        self.setStyleSheet("") 


     return super(MyWindow, self).eventFilter(obj, event) 

if __name__ == "__main__": 
    import sys 

    app = QtGui.QApplication(sys.argv) 
    app.setApplicationName('MyWindow') 

    main = MyWindow() 
    main.show() 

    sys.exit(app.exec_()) 
1

只要接收到信号QTextEdit::textChanged(),并且每个用户都进行了更改,请扫描文本' - >'。 Granter每次扫描整个文本块的蛮力方法都不好;另一种选择是只扫描文本的最后两个字符。然而,这忽略了用户通过删除' - '和'>'字符之间的文本来创建' - >'的情况。如果你不担心这种情况,那么就和最后两个一起去吧。 QTextEdit::cursorPositionChanged可能允许您在插入/删除点精确测试。