2012-11-27 5 views
2

시프트 + 탭이 QTextEdit/QPlainTextEdit의 탭으로 동작합니다.QTextEdit 시프트 탭의 잘못된 동작

좋은 해결책이없는 일반적인 문제처럼 보입니다.

탭에서 들여 쓰기 수준을 높이고 Shift 키를 누른 상태에서 탭을 낮추면이 기능을 사용할 수있는 방법이 있습니까?

답변

2

이것은 약간의 오래된 질문이지만, 나는 알아 냈습니다. QPlainTextEdit (또는 QTextEdit)을 상속받은 자신의 클래스로 다시 구현하고 keyPressEvent를 재정의하면됩니다. 기본적으로

이 탭은 탭 위치를 삽입하지만, 아래의 코드는 근처에 내가 말할 수있는 당신이 시프트 + 를 누를 때 발생하는 이벤트입니다 Qt.Key_Backtab 이벤트를 잡는다.

Qt.Key_TabQt.Key_Shift 또는 Qt.Key_Tab과 Shift 한정자를 잡아 내지 못 했으므로이 방법을 사용해야합니다.

import sys 
from PyQt4 import QtCore, QtGui 

class TabPlainTextEdit(QtGui.QTextEdit): 
    def __init__(self,parent): 
     QtGui.QTextEdit.__init__(self, parent) 

    def keyPressEvent(self, event): 
     if event.key() == QtCore.Qt.Key_Backtab: 
      cur = self.textCursor() 
      # Copy the current selection 
      pos = cur.position() # Where a selection ends 
      anchor = cur.anchor() # Where a selection starts (can be the same as above) 

      # Can put QtGui.QTextCursor.MoveAnchor as the 2nd arg, but this is the default 
      cur.setPosition(pos) 

      # Move the position back one, selection the character prior to the original position 
      cur.setPosition(pos-1,QtGui.QTextCursor.KeepAnchor) 

      if str(cur.selectedText()) == "\t": 
       # The prior character is a tab, so delete the selection 
       cur.removeSelectedText() 
       # Reposition the cursor with the one character offset 
       cur.setPosition(anchor-1) 
       cur.setPosition(pos-1,QtGui.QTextCursor.KeepAnchor) 
      else: 
       # Try all of the above, looking before the anchor (This helps if the achor is before a tab) 
       cur.setPosition(anchor) 
       cur.setPosition(anchor-1,QtGui.QTextCursor.KeepAnchor) 
       if str(cur.selectedText()) == "\t": 
        cur.removeSelectedText() 
        cur.setPosition(anchor-1) 
        cur.setPosition(pos-1,QtGui.QTextCursor.KeepAnchor) 
       else: 

        # Its not a tab, so reset the selection to what it was 
        cur.setPosition(anchor) 
        cur.setPosition(pos,QtGui.QTextCursor.KeepAnchor) 
     else: 
      return QtGui.QTextEdit.keyPressEvent(self, event) 

def main(): 
    app = QtGui.QApplication(sys.argv) 
    w = TabPlainTextEdit(None) 
    w.show() 
    sys.exit(app.exec_()) 

if __name__ == "__main__": 
    main() 

나는 아직이 정제하지만 rest of the code is on GitHub하고 있습니다.