• QDebug 日志输出的浏览器


    实现功能


    1、将qDebug、qWarning等输出显示到一个窗口部件

    2、窗口部件根据日志等级显示不同颜色

    实现方法


    日志重定向:qInstallMessageHandler

    定义MsgHandlerWapper类,qDebug、qWarning 等的输出会通过该类的 message 信号发送出来

    定义LogViewer类,采用QListWidget,显示日志信息,关联MsgHandlerWapper信号

    日志传递到界面过程如下图所示:

     

    最终效果


    代码


    MsgHandlerWapper.h

    1. #ifndef MSGHANDLERWAPPER_H
    2. #define MSGHANDLERWAPPER_H
    3. #include
    4. class MsgHandlerWapper: public QObject
    5. {
    6. Q_OBJECT
    7. public:
    8. static MsgHandlerWapper *instance();
    9. signals:
    10. void message(QtMsgType type, const QString &msg);
    11. private:
    12. MsgHandlerWapper();
    13. static MsgHandlerWapper *m_instance;
    14. };
    15. #endif // MSGHANDLERWAPPER_H

    MsgHandlerWapper.cpp

    qMessageOutput重定向函数中,通过MsgHanderWapper发射message信号

    1. #include "MsgHandlerWapper.h"
    2. #include
    3. #include
    4. #include
    5. #include
    6. void qMessageOutput(QtMsgType type, const QMessageLogContext &context, const QString &msg)
    7. {
    8. QMetaObject::invokeMethod(MsgHandlerWapper::instance(), "message"
    9. , Q_ARG(QtMsgType, type)
    10. , Q_ARG(const QString, msg));
    11. QByteArray localMsg = msg.toLocal8Bit();
    12. switch (type)
    13. {
    14. case QtDebugMsg:
    15. fprintf(stderr, "Debug: %s (%s:%u)\n", localMsg.constData(), context.file, context.line);
    16. break;
    17. case QtInfoMsg:
    18. fprintf(stderr, "Info: %s (%s:%u)\n", localMsg.constData(), context.file, context.line);
    19. break;
    20. case QtWarningMsg:
    21. fprintf(stderr, "Warning: %s (%s:%u)\n", localMsg.constData(), context.file, context.line);
    22. break;
    23. case QtCriticalMsg:
    24. fprintf(stderr, "Critical: %s (%s:%u)\n", localMsg.constData(), context.file, context.line);
    25. break;
    26. case QtFatalMsg:
    27. fprintf(stderr, "Fatal: %s (%s:%u)\n", localMsg.constData(), context.file, context.line);
    28. abort();
    29. }
    30. }
    31. MsgHandlerWapper *MsgHandlerWapper::m_instance = 0;
    32. MsgHandlerWapper *MsgHandlerWapper::instance()
    33. {
    34. static QMutex mutex;
    35. if (!m_instance)
    36. {
    37. QMutexLocker locker(&mutex);
    38. if (!m_instance)
    39. {
    40. m_instance = new MsgHandlerWapper;
    41. }
    42. }
    43. return m_instance;
    44. }
    45. MsgHandlerWapper::MsgHandlerWapper()
    46. : QObject(qApp)
    47. {
    48. qRegisterMetaType("QtMsgType");
    49. qInstallMessageHandler(qMessageOutput);
    50. }

    LogViewer.h

    1. #ifndef LOGVIEWER_H
    2. #define LOGVIEWER_H
    3. #include
    4. namespace Ui
    5. {
    6. class LogViewer;
    7. }
    8. class LogViewer : public QFrame
    9. {
    10. Q_OBJECT
    11. public:
    12. enum MessageLevel
    13. {
    14. NORMAL_LEVEL = 0,
    15. WARNING_LEVEL = 1,
    16. ERROR_LEVEL = 2
    17. };
    18. explicit LogViewer(QWidget *parent = 0);
    19. ~LogViewer();
    20. int maxLines() const;
    21. void setMaxLines(int num);
    22. void outputMessage(const MessageLevel &level, const QString &msg);
    23. private slots:
    24. void outputMessage(QtMsgType type, const QString &msg);
    25. private:
    26. Ui::LogViewer *ui;
    27. int m_maxLines;
    28. };
    29. #endif // LOGVIEWER_H

    LogViewer.cpp

    connect到MsgHandlerWapper实例的message信号

    设置前景与背景改变颜色

    1. #include "LogViewer.h"
    2. #include "ui_LogViewer.h"
    3. #include
    4. #include "MsgHandlerWapper.h"
    5. LogViewer::LogViewer(QWidget *parent) :
    6. QFrame(parent),
    7. ui(new Ui::LogViewer), m_maxLines(100)
    8. {
    9. ui->setupUi(this);
    10. connect(MsgHandlerWapper::instance(),
    11. SIGNAL(message(QtMsgType, QString)),
    12. SLOT(outputMessage(QtMsgType, QString)));
    13. }
    14. LogViewer::~LogViewer()
    15. {
    16. delete ui;
    17. }
    18. int LogViewer::maxLines() const
    19. {
    20. return m_maxLines;
    21. }
    22. void LogViewer::setMaxLines(int num)
    23. {
    24. m_maxLines = num;
    25. }
    26. void LogViewer::outputMessage(QtMsgType type, const QString &msg)
    27. {
    28. switch (type)
    29. {
    30. case QtDebugMsg:
    31. outputMessage(NORMAL_LEVEL, msg);
    32. break;
    33. case QtInfoMsg:
    34. outputMessage(NORMAL_LEVEL, msg);
    35. break;
    36. case QtWarningMsg:
    37. outputMessage(WARNING_LEVEL, msg);
    38. break;
    39. case QtCriticalMsg:
    40. outputMessage(ERROR_LEVEL, msg);
    41. break;
    42. case QtFatalMsg:
    43. outputMessage(ERROR_LEVEL, msg);
    44. }
    45. }
    46. void LogViewer::outputMessage(const LogViewer::MessageLevel &level, const QString &msg)
    47. {
    48. if(ui->listWidget->count() >= m_maxLines)
    49. {
    50. ui->listWidget->removeItemWidget(ui->listWidget->takeItem(0));
    51. }
    52. QDateTime current_date_time = QDateTime::currentDateTime();
    53. QString current_date = current_date_time.toString("yyyy.MM.dd hh:mm:ss.zzz ddd");
    54. QString text = tr("[%1] %2").arg(current_date).arg(msg);
    55. QListWidgetItem *newItem = new QListWidgetItem(text);
    56. newItem->setSizeHint(QSize(60, 30));
    57. switch (level)
    58. {
    59. case MessageLevel::NORMAL_LEVEL:
    60. {
    61. }
    62. break;
    63. case MessageLevel::WARNING_LEVEL:
    64. {
    65. newItem->setBackground(QColor(255, 185, 15));
    66. }
    67. break;
    68. case MessageLevel::ERROR_LEVEL:
    69. {
    70. newItem->setBackground(QColor(255, 0, 0));
    71. newItem->setForeground(QColor(255, 255, 255));
    72. }
    73. break;
    74. default:
    75. break;
    76. }
    77. ui->listWidget->addItem(newItem);
    78. ui->listWidget->scrollToBottom();
    79. }

     

  • 相关阅读:
    金融企业Web应用什么防火墙好?
    支付宝小程序集成MQTT
    一文带你搞清楚Python的多线程和多进程
    工具及方法 - 如何生成付费链接和短链接
    共享股东模式:创新方法助力连锁门店扩展业务并提高利润
    Fastjson反序列化漏洞
    数字电平(二):电平转换
    Day04 HTML标记
    jvm07
    C#实现观察者模式
  • 原文地址:https://blog.csdn.net/qq_40602000/article/details/126960055