神秘的换行符被添加到 QPlainTextEdit 的末尾
Mystery newline being added to the end of QPlainTextEdit
我正在使用 Python 2.7 和 PyQt5 制作一种命令行模拟器,它的工作方式是您输入的每个字符它都会侦听键。当您按下它时,它会调用 self.parse()
来执行操作。
当我加载 window 时,它工作正常,光标位于提示 (C:\>
) 之后。当我输入一个命令并按下回车键时,内容被打印出来,并打印出一个新的提示符。然后打印一个换行符,光标放在该换行符之后。
我不想要这个。我该如何解决?
我尝试过很多不同的东西。我试过了 plainTextEdit.textCursor().deletePreviousChar()
。我试过使用 insertPlainText
和 appendPlainText
。在每种情况下都会发生同样的事情。真的很郁闷。
更令人沮丧的是我不知道在我的代码中的什么地方添加了换行符。它可能不在 parse
中,否则 deletePreviousChar
会起作用。我想不出还有什么地方...
这是我的 class:
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))
有人能帮忙吗?
需要绕过return/enter的正常处理,然后使用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:\> ")
我正在使用 Python 2.7 和 PyQt5 制作一种命令行模拟器,它的工作方式是您输入的每个字符它都会侦听键。当您按下它时,它会调用 self.parse()
来执行操作。
当我加载 window 时,它工作正常,光标位于提示 (C:\>
) 之后。当我输入一个命令并按下回车键时,内容被打印出来,并打印出一个新的提示符。然后打印一个换行符,光标放在该换行符之后。
我不想要这个。我该如何解决?
我尝试过很多不同的东西。我试过了 plainTextEdit.textCursor().deletePreviousChar()
。我试过使用 insertPlainText
和 appendPlainText
。在每种情况下都会发生同样的事情。真的很郁闷。
更令人沮丧的是我不知道在我的代码中的什么地方添加了换行符。它可能不在 parse
中,否则 deletePreviousChar
会起作用。我想不出还有什么地方...
这是我的 class:
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))
有人能帮忙吗?
需要绕过return/enter的正常处理,然后使用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:\> ")