2
시프트 + 탭이 QTextEdit/QPlainTextEdit의 탭으로 동작합니다.QTextEdit 시프트 탭의 잘못된 동작
좋은 해결책이없는 일반적인 문제처럼 보입니다.
탭에서 들여 쓰기 수준을 높이고 Shift 키를 누른 상태에서 탭을 낮추면이 기능을 사용할 수있는 방법이 있습니까?
시프트 + 탭이 QTextEdit/QPlainTextEdit의 탭으로 동작합니다.QTextEdit 시프트 탭의 잘못된 동작
좋은 해결책이없는 일반적인 문제처럼 보입니다.
탭에서 들여 쓰기 수준을 높이고 Shift 키를 누른 상태에서 탭을 낮추면이 기능을 사용할 수있는 방법이 있습니까?
이것은 약간의 오래된 질문이지만, 나는 알아 냈습니다. QPlainTextEdit (또는 QTextEdit)을 상속받은 자신의 클래스로 다시 구현하고 keyPressEvent를 재정의하면됩니다. 기본적으로
이 탭은 탭 위치를 삽입하지만, 아래의 코드는 근처에 내가 말할 수있는 당신이 시프트 + 탭를 누를 때 발생하는 이벤트입니다 Qt.Key_Backtab
이벤트를 잡는다.
Qt.Key_Tab
및 Qt.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하고 있습니다.