QPlainTextEdit не скроллится при добавлении текста в треде

Если в QPlainTextEdit просто добавлять текст, то он корректно отображается и скролится автоматически, если же тоже самое сделать в треде, скроллинг не выполняется при добавлении текста. Как это исправить?

import logging
import time
from concurrent.futures import wait, ThreadPoolExecutor

from PyQt6.QtCore import Qt, QObject
from PyQt6.QtWidgets import QWidget, QVBoxLayout, QLabel, QPlainTextEdit

from logger import get_logger, LOG_FORMATTER, LOG_COLORS

log = get_logger()


class GuiLoggerHandler(logging.Handler, QObject):
    def __init__(self):
        super().__init__()
        QObject.__init__(self)
        self.setFormatter(LOG_FORMATTER)
        self.widget = QPlainTextEdit()
        self.widget.setReadOnly(True)

    def emit(self, record):
        html_msg = f'<span style="color:{LOG_COLORS.get(record.levelno, "#363537")};">{self.format(record)}</span>'
        self.widget.appendHtml(html_msg)
        self.widget.verticalScrollBar().setValue(self.widget.verticalScrollBar().maximum())
        self.widget.repaint()


class Console(QWidget):
    def __init__(self):
        super().__init__()

        self.title = QLabel("Console")
        self.gui_logger = GuiLoggerHandler()

        self.init_ui()

    def init_ui(self):
        log.addHandler(self.gui_logger)
        self.gui_logger.widget.setObjectName('log_area')

        self.title.setObjectName('title')
        self.title.setAlignment(Qt.AlignmentFlag.AlignCenter)

        self.setLayout(QVBoxLayout())
        self.layout().addWidget(self.title)
        self.layout().addWidget(self.gui_logger.widget)

    def _log(self, text):
        log.info(str(text))
        time.sleep(0.05)
        self.gui_logger.widget.repaint()

    def keyPressEvent(self, e):
        if e.key() == Qt.Key.Key_0:
            with ThreadPoolExecutor(max_workers=1) as executor:
                futures = [
                    executor.submit(self._log, i) for i in range(100)
                ]
                wait(futures)
        if e.key() == Qt.Key.Key_1:
            for i in range(100):
                self._log(i)


Ответы (0 шт):