【问题标题】:Mystery newline being added to the end of QPlainTextEdit神秘的换行符被添加到 QPlainTextEdit 的末尾
【发布时间】:2016-06-20 01:48:18
【问题描述】:

我正在使用 Python 2.7 和 PyQt5 制作一种命令行模拟器,它的工作方式是你输入的每个字符都会监听键。当你按下它时,它会调用 self.parse() 来做事。

当我加载窗口时,它工作正常,并且光标位于提示符之后(C:\>)。当我输入命令并按回车键时,会打印内容,并打印新的提示。然后打印一个换行符,并将光标放在该换行符之后。

我不想要这个。我该如何解决?

我尝试了很多不同的东西。我试过plainTextEdit.textCursor().deletePreviousChar()。我试过使用insertPlainTextappendPlainText。在每种情况下都会发生同样的事情。真的很郁闷。

更令人沮丧的部分是我不知道在我的代码中的哪个位置添加了换行符。它可能不在parse 中,否则deletePreviousChar 会起作用。而且我想不出它会在哪里......

这是我的课:

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

有人可以帮忙吗?

【问题讨论】:

  • 你试过insertPlainText()而不是appendPlainText()吗?
  • @mhawke “我尝试过使用 insertPlainTextappendPlainText。”阅读问题:P

标签: python python-2.7 pyqt newline pyqt5


【解决方案1】:

你需要绕过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:\\> ")

【讨论】:

  • 非常感谢!似乎只是在self.parse() 工作之后添加return True。我猜当我告诉它返回 QtWidgets 的默认事件过滤器时,它只是在对 Enter 键进行默认处理。不知道我怎么没看到。无论如何,感谢您的帮助!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-05-28
  • 2015-11-01
  • 1970-01-01
  • 2017-04-28
  • 1970-01-01
  • 2021-05-15
  • 1970-01-01
相关资源
最近更新 更多