我正在使用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)进行修改后,它坚持要求对其进行了某种更改。

有谁知道这是什么原因以及我如何解决此问题?



更新:这似乎是一个错误,并且还会影响QPlainTextEdit.clear()

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

#!/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_())

最佳答案

这是一个Qt错误,直接的解决方法是检查是否指示了空白内容。

关于python - QPlainTextEdit认为如果文本为空则已被修改,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/31610351/

10-11 19:10