2016-06-20 3 views
1

Ich mache eine Art Kommandozeilen-Simulator mit Python 2.7 und PyQt5, und die Art, wie es funktioniert, ist jedes Zeichen, das Sie für den Schlüssel abhört. Wenn Sie es drücken, ruft es self.parse() an, was Zeug macht.Mystery newline wird am Ende von QPlainTextEdit hinzugefügt

Wenn ich das Fenster hochlade, funktioniert es gut, und der Cursor wird nach der Eingabeaufforderung platziert(). Wenn ich einen Befehl eintippe und die Eingabetaste drücke, wird der Stoff gedruckt und eine neue Eingabeaufforderung wird gedruckt. Dann wird ein Zeilenumbruch gedruckt und der Cursor wird nach diesem Zeilenumbruch platziert.

Ich will das nicht. Wie kann ich es reparieren?

Ich habe Tonnen verschiedener Dinge probiert. Ich habe versucht plainTextEdit.textCursor().deletePreviousChar(). Ich habe versucht, sowie appendPlainText zu verwenden. Das gleiche passiert in jedem Fall. Es ist wirklich frustrierend.

Der noch frustrierendere Teil ist, ich habe keine Ahnung, wo in meinem Code die Zeilenschaltung hinzugefügt wird. Es ist wahrscheinlich nicht in parse oder sonst deletePreviousChar würde funktionieren. Und ich kann nicht glauben, wo sonst wäre es ...

Hier ist meine Klasse:

class CmdLine(QtWidgets.QMainWindow): 
    def __init__(self): 
     QtWidgets.QMainWindow.__init__(self) 

     self.ui = uic.loadUi('cmd.ui', self) 
     self.ui.show() 

     self.plainTextEdit.appendPlainText("C:\\> ") 

     self.plainTextEdit.installEventFilter(self) 

     self.editable = True 
     self.keys = [] 
     self.lolnope = [] 

    def eventFilter(self, widget, event): 
     if event.type() == QtCore.QEvent.KeyPress: 
      print event.text() 
      if self.editable: 
       if event.key() == QtCore.Qt.Key_Return: 
        self.parse() 
       else: 
        self.keys += event.text() 
       return QtWidgets.QMainWindow.eventFilter(self, widget, event) 
      else: 
       self.lolnope += event.text() 
       return True 
     else: 
      return QtWidgets.QMainWindow.eventFilter(self, widget, event) 

    def parse(self): 
     self.editable = False 
     self.plainTextEdit.moveCursor(QtGui.QTextCursor.End) 
     s = ''.join(self.keys) 
     # parse input and do things 
     self.keys = [] 
     self.editable = True 
     self.plainTextEdit.moveCursor(QtGui.QTextCursor.End) 
     self.plainTextEdit.appendPlainText("C:\\> ") 
     self.plainTextEdit.textCursor().deletePreviousChar(); 

    def __del__(self): 
     with open('lolnope.txt', 'w') as f: 
      f.write(''.join(self.lolnope)) 

Könnte mir jemand helfen?

+0

Haben Sie versucht, 'insertPlainText()' statt 'appendPlainText()'? – mhawke

+0

@mhawke "Ich habe versucht,' insertPlainText' sowie 'appendPlainText' zu verwenden." Lesen Sie die Frage: P – TheInitializer

Antwort

1

Sie müssen den normalen Umgang mit Rückkehr umgehen/eingeben und dann insertPlainText verwenden, um zu steuern, wie Zeilenumbrüche eingegeben werden:

class CmdLine(QtWidgets.QMainWindow): 
    def __init__(self): 
     super(CmdLine, self).__init__() 
     ... 
     self.plainTextEdit.insertPlainText("C:\\> ") 

    def eventFilter(self, widget, event): 
     if event.type() == QtCore.QEvent.KeyPress: 
      print event.text() 
      if self.editable: 
       if (event.key() == QtCore.Qt.Key_Return or 
        event.key() == QtCore.Qt.Key_Enter): 
        self.parse() 
        # bypass default handling 
        return True 
       else: 
        self.keys += event.text() 
      else: 
       self.lolnope += event.text() 
       return True 
     return super(CmdLine, self).eventFilter(widget, event) 

    def parse(self): 
     ... 
     # terminate current line and start a new one 
     self.plainTextEdit.insertPlainText("\nC:\\> ") 
+0

Vielen Dank! Es scheint, als würde nur 'return True' hinzugefügt, nachdem' self.parse() 'funktioniert hat. Ich denke, es war nur die Standardbehandlung der Enter-Taste drücken, wenn ich sagte, dass QtWidgets Standard-Ereignisfilter zurückgeben soll. Ich bin mir nicht sicher, wie ich das nicht gesehen habe. Wie auch immer, danke für die Hilfe! – TheInitializer