Графическая ошибка QPlainTextEdit в Windows и Linux

Я пишу простой графический интерфейс, который отображает журнал обновлений в режиме реального времени в QPlainTextEdit.

Это обработчик, который я передаю logging.Logger.addHandler()

class QPlainTextEditLogger(logging.Handler):
    """Modified From: https://stackoverflow.com/questions/28655198/best-way-to-display-logs-in-pyqt"""

    def __init__(self, parent):
        super().__init__()
        self.widget = QPlainTextEdit()
        self.widget.setReadOnly(True)

    def emit(self, record):
        msg = self.format(record)
        self.widget.appendPlainText(msg)
        self.widget.moveCursor(QtGui.QTextCursor.End)

    def write(self, m):
        pass

Он правильно передает записи журнала, которые я ищу, в элемент QPlainTextEdit, однако существует графический сбой, который сохраняется независимо от платформы (или включения/отключения композитинга).
Вот видео поведения:

https://i.imgur.com/DTUbfcM.mp4

Строки разрезаются пополам, если я вручную не прокручиваю поле или не изменяю размер разделителя.

Это также происходит независимо от того, реализую ли я автопрокрутку в приведенном выше фрагменте а-ля:

moveCursor(QtGui.QTextCursor.End)

Что может быть причиной этого?

Изменить: я попытался воспроизвести это с помощью приведенного ниже примера, но я не сталкиваюсь с той же проблемой. Я думаю, это может быть связано с тем, что я создал QPlainTextEdit() в своем исходном коде за пределами главного окна?

import sys
import time

from PyQt5 import QtWidgets, uic, QtGui
from PyQt5.QtWidgets import QPlainTextEdit
from PyQt5.QtCore import QThread, pyqtSignal

class Worker(QThread):
    newLine = pyqtSignal(str)

    def __init__(self):
        super().__init__()
    
    def run(self):
        for x in range(300):
            self.newLine.emit(f"Testing a very long line so that the words will wrap and hopefully reproduce the issue Testing a very long line so that the words will wrap and hopefully reproduce the issue {x}")
            time.sleep(0.1)


class Window(QtWidgets.QMainWindow):
    def __init__(self):
        super().__init__()
        self.editor = QPlainTextEdit(self)
        self.editor.setReadOnly(True)

        self.button = QtWidgets.QPushButton(self)
        self.button.setText("Go for it")

        self.layout = QtWidgets.QFormLayout()
        self.layout.addChildWidget(self.editor)
        self.layout.addChildWidget(self.button)

        self.button.clicked.connect(self.start_button_pressed)
        self.setCentralWidget(self.editor)
        self.show()

    def add_line(self, msg: str):
        self.editor.appendPlainText(msg)

    def start_button_pressed(self):
        self.worker = Worker()
        self.worker.newLine.connect(self.add_line)
        self.worker.start()

app = QtWidgets.QApplication(sys.argv)
window = Window()
app.exec_()

person James    schedule 17.10.2020    source источник
comment
предоставьте минимальный воспроизводимый пример   -  person eyllanesc    schedule 17.10.2020
comment
Вы случайно не используете ведение журнала в отдельном потоке?   -  person musicamante    schedule 17.10.2020
comment
@musicamante Я действительно веду регистрацию из другой темы. Я только что проверил поведение, делая минимальный пример воспроизведения, но не смог воспроизвести на самом деле. Я испускаю строку в QPlainTextBox из другого потока, но я не сталкиваюсь с той же проблемой   -  person James    schedule 17.10.2020
comment
@James Прямой доступ к элементам графического интерфейса никогда не должен осуществляться из других потоков. В ссылке, которую вы дали, есть есть потокобезопасный ответ. Используйте это.   -  person musicamante    schedule 17.10.2020
comment
@musicamante Спасибо, это имеет смысл. Я тоже наткнулся на этот ответ после того, как вы сообщили мне о проблеме с потоками. Ваше здоровье   -  person James    schedule 17.10.2020