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.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_())

1 ответ

Решение

Это ошибка Qt, и простой обходной путь - проверить наличие пустого содержимого, если указаны изменения.

Другие вопросы по тегам