I want to redirect all the logging to QPlainTextEdit. I have been able to achieve that by following this thread. However, I have a bit of problem understand the actual code:
import logging
import sys
from PyQt5.QtCore import pyqtSignal, QObject
from PyQt5 import QtWidgets
class Handler(QObject, logging.Handler):
new_record = pyqtSignal(object)
def __init__(self):
super().__init__()
super(logging.Handler).__init__()
def emit(self, record):
msg = self.format(record)
self.new_record.emit(msg)
class Formatter(logging.Formatter):
def formatException(self, ei):
result = super(Formatter, self).formatException(ei)
return result
def format(self, record):
s = super(Formatter, self).format(record)
if record.exc_text:
s = s.replace('\n', '')
return s
class MyTextBox(QtWidgets.QMainWindow):
def __init__(self):
super().__init__()
container = QtWidgets.QGroupBox()
layout = QtWidgets.QVBoxLayout()
self.text_box = QtWidgets.QPlainTextEdit()
self.text_box.setReadOnly(True)
layout.addWidget(self.text_box)
self.btn = QtWidgets.QPushButton("Click me")
layout.addWidget(self.btn)
container.setLayout(layout)
self.setCentralWidget(container)
handler = Handler()
logging.getLogger().addHandler(handler)
logging.getLogger().setLevel(logging.INFO)
handler.new_record.connect(self.text_box.appendPlainText)
self.btn.clicked.connect(self.heClickedMe)
def heClickedMe(self):
logging.debug('damn, a bug')
logging.info('something to remember')
logging.warning('that\'s not right')
logging.error('foobar')
app = QtWidgets.QApplication(sys.argv)
dlg = MyTextBox()
dlg.show()
sys.exit(app.exec_())
So I have trouble understanding the "emit" method in Handler class. For example, is "emit" a method of logging.Handler or QObject? When will "emit" be called?