Предупреждение при выводе текста в виджет PyQt5, что они означают?
Столкнулся с проблемой. В виджет QPlainTextEdit, строчки выводятся криво. Это не постоянно, но проблема уже с самого начала работы мешает. Помогает перезапуска кода.
Перед запуском кода вылезает предупреждение, либо вот такое, оно ничего особенного за собой не несёт:
QObject::connect: Cannot queue arguments of type 'QTextBlock'
(Make sure 'QTextBlock' is registered using qRegisterMetaType().)
QObject::connect: Cannot queue arguments of type 'QTextCursor'
(Make sure 'QTextCursor' is registered using qRegisterMetaType().)
Второе предупреждение, вместе взятое с первым:
QObject::connect: Cannot queue arguments of type 'QTextBlock'
(Make sure 'QTextBlock' is registered using qRegisterMetaType().)
QObject::connect: Cannot queue arguments of type 'QTextCursor'
(Make sure 'QTextCursor' is registered using qRegisterMetaType().)
QPainter::begin: Paint device returned engine == 0, type: 3
QPainter::setCompositionMode: Painter not active
QPainter::end: Painter not active, aborted
Ну и, в итоге, выходит вот такая картина:
Если скопировать, то на самом деле, с текстом всё впорядке:
=============================================================================================================
15/06/2021 | 18:28:11 > BOT CONNECTED - Heimdallr#8868 :)
15/06/2021 | 18:28:11 > config> LOG CHANNEL : 820631085271875587
15/06/2021 | 18:28:11 > config> CHANNEL VoIP: 820631085271875587
=============================================================================================================
Вывод работает потоком:
class QTextEditLogger(logging.Handler):
def __init__(self, parent):
super().__init__()
window = QWidget()
self.centralwidget = QtWidgets.QWidget(window)
self.PVELogs = QtWidgets.QPlainTextEdit(parent.centralwidget)
self.PVELogs.setGeometry(QtCore.QRect(40, 50, 801, 491))
font = QtGui.QFont()
font.setFamily("Consolas")
font.setPointSize(10)
self.PVELogs.setFont(font)
self.PVELogs.setStyleSheet("background-color: rgb(30, 30, 30); color: rgb(255, 255, 255);")
self.PVELogs.setReadOnly(True)
self.PVELogs.setPlainText("")
def emit(self, record):
msg = self.format(record)
self.PVELogs.appendPlainText(msg)
self.PVELogs.update() # +++
class WorkThread(QtCore.QThread):
threadSignal = QtCore.pyqtSignal(int)
def __init__(self):
super().__init__()
def run(self):
i = ''
self.msleep(2000)
self.threadSignal.emit(i) # < Выводит текст.
loop = asyncio.new_event_loop()
START_BOT = bot.loop.create_task(bot.run(config.BOT_TOKEN))
ON_READY = bot.loop.create_task(on_ready())
bot.loop.run_until_complete(START_BOT)
bot.loop.run_until_complete(ON_READY)
bot.loop.run_forever()
Проблема возникает когда подключаю on_ready() через WorkThread(), с помощью asyncio:
@bot.event
async def on_ready():
print("FUNC: ON_READY ")
logging.warning(" =============================================================================================================")
log(f'BOT CONNECTED - {bot.user} :)')
log('config> LOG CHANNEL : %d' % (lchanID))
if config.USEVCSTATS == True:
log('config> CHANNEL VoIP: %d' % (chanID))
logging.warning(" =============================================================================================================\n")
await asyncio.sleep(0.2)
Дополнил def emit() - self.PVELogs.update(), на время помогло, но код стал дополняться и проблема вновь пришла.
Ответы (1 шт):
я не могу проверить ваш пример, но предложу попробовать следующее:
...
class MySignal(QObject): # +++
log_signal = pyqtSignal(str) # +++
class QTextEditLogger(logging.Handler):
def __init__(self, parent):
super().__init__()
sels.mySignal = MySignal() # +++
''' # !!! перенес в class Main
window = QWidget()
self.centralwidget = QtWidgets.QWidget(window)
self.PVELogs = QtWidgets.QPlainTextEdit(parent.centralwidget)
self.PVELogs.setGeometry(QtCore.QRect(40, 50, 801, 491))
font = QtGui.QFont()
font.setFamily("Consolas")
font.setPointSize(10)
self.PVELogs.setFont(font)
self.PVELogs.setStyleSheet("background-color: rgb(30, 30, 30); color: rgb(255, 255, 255);")
self.PVELogs.setReadOnly(True)
self.PVELogs.setPlainText("")
'''
def emit(self, record):
msg = self.format(record)
sels.mySignal.log_signal.emit(msg) # +++ <---- emit signal here
''' # !!! перенес в class Main
self.PVELogs.appendPlainText(msg)
self.PVELogs.update()
'''
...
# vvvvvvv <---------------------------- ???
# class Main(QtWidgets.QMainWindow, QWidget, MainInterface):
class Main(QtWidgets.QMainWindow, MainInterface):
def __init__(self):
super().__init__()
self.setupUi(self)
self.myclose = True
logTextBox = QTextEditLogger(self)
# +++
logTextBox.mySignal.log_signal.connect(self.append_plain_text) # +++
logging.getLogger().addHandler(logTextBox)
logging.getLogger().setLevel(logging.WARNING)
root_logger = logging.getLogger()
#root_logger.setLevel(logging.INFO)
handler = logging.FileHandler('App.log', 'a', 'utf-8')
handler.setFormatter(logging.Formatter('%(name)s, %(asctime)s, [%(levelname)s], %(message)s'))
root_logger.addHandler(handler)
self.PVELogs.setTextInteractionFlags(QtCore.Qt.TextSelectableByMouse)
self.thread = WorkThread()
self.thread.threadSignal.connect(self.func2)
self.onPVE.clicked.connect(self.func1)
self.onPVE.clicked.connect(self.change_button)
self.offPVE.clicked.connect(self.offwhite)
logging.warning(" ========================================= VALHEIMBY LOGS - v1.0.0 ==========================================")
logging.warning(" =============================================================================================================\n")
# +++ vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvb
self.PVELogs = QtWidgets.QPlainTextEdit(self.centralwidget)
self.PVELogs.setGeometry(QtCore.QRect(40, 50, 801, 491))
font = QtGui.QFont()
font.setFamily("Consolas")
font.setPointSize(10)
self.PVELogs.setFont(font)
self.PVELogs.setStyleSheet("background-color: rgb(30, 30, 30); color: rgb(255, 255, 255);")
self.PVELogs.setReadOnly(True)
self.PVELogs.setPlainText("")
def append_plain_text(self, msg):
self.PVELogs.appendPlainText(msg)
# +++ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
...
