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, и простой обходной путь - проверить наличие пустого содержимого, если указаны изменения.