0

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?

1 Answers1

1
  1. is "emit" a method of logging.Handler or QObject?: To know the methods of the classes you have to use the docs and clearly emit is a method of logging.Handler.

  2. When will "emit" be called?: This method is called internally when using the debug, info, warning and error methods.

eyllanesc
  • 235,170
  • 19
  • 170
  • 241