使用PyQt5

时间:2016-03-09 14:21:20

标签: python qt pyqt5

我使用python2.7,Qt5.5和PyQt5实现了一个应用程序。我使用logging使用Python-logger工作 - 模块:Log-Messages既发送到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中找到该类。

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

1 个答案:

答案 0 :(得分:8)

您可以安装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
  • 包装