2016-06-20 125 views
1

我正在製作一種使用Python 2.7和PyQt5的命令行模擬器,它的工作方式是每輸入一個字符,它都會監聽密鑰。當你按下它時,它會呼叫self.parse()這做什麼。Mystery newline被添加到QPlainTextEdit的末尾

當我加載窗口它工作正常,光標放在提示符後(C:\>)。當我輸入一個命令,然後按回車鍵時,打印的東西,並打印一個新的提示。然後打印換行符,並將光標放在該換行符之後。

我不想要這個。我該如何解決它?

我試過不同的東西。我試過plainTextEdit.textCursor().deletePreviousChar()。我試過使用insertPlainText以及appendPlainText。每種情況都會發生同樣的事情。這真是令人沮喪。

更令人沮喪的部分是我不知道在我的代碼中添加換行符的位置。它可能不在parsedeletePreviousChar將工作。我想不出還有什麼地方會是...

這裏是我的類:

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)) 

誰能幫助?

+0

你嘗試的'insertPlainText()''而不是appendPlainText()'? – mhawke

+0

@mhawke 「我嘗試過使用'insertPlainText'以及'appendPlainText'。」 閱讀問題:P – TheInitializer

回答

1

需要繞行的回報/進入正常處理,然後用insertPlainText控制如何換行中輸入:

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

非常感謝!這似乎只是在'self.parse()'工作後添加'return True'。我想這只是當我告訴它返回QtWidgets的默認事件過濾器時,按下Enter鍵的默認處理。不知道我怎麼沒有看到。無論如何,感謝您的幫助! – TheInitializer