使用 PyQt5 将 qDebug 输出重定向到文件

Redirect qDebug output to file with PyQt5

我使用 python2.7、Qt5.5 和 PyQt5 实现了一个应用程序。我让 Python-logger 使用 logging-Module 工作:日志消息都发送到 stderr 和日志文件。

但是,Qt 日志消息只出现在 stderr 中,我找不到将它们重定向到文件的方法。

为了缩小问题范围,我尝试了这个:

>>> from PyQt5.QtCore import qDebug
>>> import sys
>>> sys.stderr = open("stderr.txt", 'w')
>>> qDebug('test message')
test message
>>> sys.stderr.close()
>>> # stderr.txt is empty

注: 纯 Qt 方式似乎在操纵一个 QDebug 对象,但我无法在 PyQt5 中找到 class。

问题: 如何让 qDebug 写入文件 stderr.txt

你可以安装一个message handler:

import sys
from PyQt5 import QtCore, QtWidgets

def qt_message_handler(mode, context, message):
    if mode == QtCore.QtInfoMsg:
        mode = 'INFO'
    elif mode == QtCore.QtWarningMsg:
        mode = 'WARNING'
    elif mode == QtCore.QtCriticalMsg:
        mode = 'CRITICAL'
    elif mode == QtCore.QtFatalMsg:
        mode = 'FATAL'
    else:
        mode = 'DEBUG'
    print('qt_message_handler: line: %d, func: %s(), file: %s' % (
          context.line, context.function, context.file))
    print('  %s: %s\n' % (mode, message))

QtCore.qInstallMessageHandler(qt_message_handler)

app = QtWidgets.QApplication(sys.argv)

def main():
    QtCore.qDebug('something informative')
    win = QtWidgets.QMainWindow()
    # trigger a Qt debug message
    win.setLayout(QtWidgets.QVBoxLayout())

main()

但注意:

  • 上下文属性将始终用于 python 代码,但对于 来自 Qt 的消息,您将需要一个调试版本(或 QT_MESSAGELOGCONTEXT 在发布版本中定义)
  • 出于某种原因,qInfo() 当前未被 PyQt 包装