Я пишу простой графический интерфейс, который отображает журнал обновлений в режиме реального времени в 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_()