Python QPlainTextEdit认为它';如果它有一个空文本,它将被修改

Python QPlainTextEdit认为它';如果它有一个空文本,它将被修改,python,qt,pyqt,qplaintextedit,Python,Qt,Pyqt,Qplaintextedit,我正在使用PyQt构建一个简单的IDE,如果加载一个空文件,就会出现奇怪的错误。下面是一个小脚本示例: #!/usr/bin/env python import sys from PyQt4 import QtGui class TestApp(QtGui.QMainWindow): def __init__(self, filename=None): super(TestApp, self).__init__() self._editor = QtGui

我正在使用PyQt构建一个简单的IDE,如果加载一个空文件,就会出现奇怪的错误。下面是一个小脚本示例:

#!/usr/bin/env python
import sys
from PyQt4 import QtGui
class TestApp(QtGui.QMainWindow):
    def __init__(self, filename=None):
        super(TestApp, self).__init__()
        self._editor = QtGui.QPlainTextEdit()
        self._editor.modificationChanged.connect(self._change_modified)
        self.setCentralWidget(self._editor)
        self._editor.setPlainText('a')
    def _change_modified(self, have_change):
        print(have_change)
if __name__ == '__main__':
    a = QtGui.QApplication([])
    app = TestApp()
    app.show()
    sys.exit(a.exec_())
正如预期的那样,这将显示一个带有纯文本编辑器的窗口。只要调用
setPlainText
方法,编辑器就会发出两个事件:一个
modificationChanged
事件为
changes=True
,另一个为
changes=False
。 有点奇怪,但很好。 但是,如果将
setPlainText('a')
更改为
setPlainText(“”)
,则只会发出一个事件,这次是
changes=True
。更糟糕的是,在告诉编辑器它没有被
setModified(False)
修改后,它坚持说它已经被修改了

有人知道这是什么原因吗?我如何解决这个问题


更新:这似乎是一个bug&也会影响
QPlainTextEdit.clear()

下面的解决方法在
QPlainTextEdit
周围放置一个包装器,以修复
clear()
setPlainText(“”)


这是一个Qt错误,简单的解决方法是在指示修改时检查空内容。

我在这里找到了一个报告:但对您的解决方法不太确定:如果用户清除字段(使用delete或backspace),会发生什么?一个稍微奇怪的解决方法是将setPlainText(“”)替换为selectAll()然后使用光标删除它和document()。setModified(False)。。。
#!/usr/bin/env python
import sys
from PyQt4 import QtGui
class TestApp(QtGui.QMainWindow):
    def __init__(self, filename=None):
        super(TestApp, self).__init__()
        self._editor = PlainTextEdit()
        self._editor.modificationChanged.connect(self._change_modified)
        self.setCentralWidget(self._editor)
        self._editor.setPlainText('')
    def _change_modified(self, have_change):
        print(have_change)
class PlainTextEdit(QtGui.QPlainTextEdit):
    def clear(self):
        self.selectAll()
        cursor = self.textCursor()
        cursor.removeSelectedText()
        doc = self.document()
        doc.clearUndoRedoStacks()
        doc.setModified(False)
        self.modificationChanged.emit(False)
    def setPlainText(self, text):
        if text:
            super(PlainTextEdit, self).setPlainText(text)
        else:
            self.clear()
if __name__ == '__main__':
    a = QtGui.QApplication([])
    app = TestApp()
    app.show()
    sys.exit(a.exec_())