(qInstallMessageHandler)를 출력 디버그 정보를 리디렉션 QT

도구는 짧은 Qt5 테스트 코드를 할 필요가 있기 때문에, 사용자의 경우 참조는 다음과 같은 기능을 테스트

 

1 qDebug ()는 출력 창 QT 리디렉션

2 qDebug는 () 로컬 파일에 정보를 저장합니다

QtMessageHandler qInstallMessageHandler (QtMessageHandler 거래)

  이 기능은 Qt는 메시지 핸들러를 사용하기 전에 정의되어 있습니다. 메시지 처리기 전에 포인트를 돌려줍니다.
  메시지 핸들러는 에러 메시지 qDebug, qWarning, qCritical 및 qFatal를 인쇄하는 기능이다. Qt는 라이브러리 (디버그 모듈) (일반적으로 효과가 함수 매개 변수)를 인쇄 할 때 경고 메시지의 수백을 포함하는 내부 오류가 발생했습니다. 릴리스 모드에서 Qt를 건설 더 추가 QT_NO_WARNING_OUTPUT에 포함 및 / 또는 경고가 QT_NO_DEBUG_OUTPUT 컴파일 제공되었습니다. 당신이 당신의 자신의 메시지 핸들러를 구현하는 경우, 당신은이 메시지를 완벽하게 제어 할 필요가있다.
  X11 또는 Windows 디버거에서 기본 메시지 핸들러는 표준 출력에 메시지를 인쇄합니다. 이 치명적인 메시지의 경우, 응용 프로그램이 즉시 중지합니다.
  그것은 보통의 디버거 애플리케이션의 출력 제어에 기초하여 수행 될 때 단지 하나의 메시지 핸들러가 정의 될 수있다.
  복구 메시지 처리기, qInstallMessageHandler (0)로 전화하십시오.

참고 : 

QT4 : qInstallMsgHandler ()

QT5 : qInstallMessageHandler ()

참고 1 : https://www.cnblogs.com/wyuzm/p/9580447.html

참고 2 : https://blog.csdn.net/lbsljn/article/details/73804445?utm_source=blogxgwz0

TextBrower 일반적인 위젯 설명 : HTTPS : //www.xuebuyuan.com/3179243.html

https://forum.qt.io/topic/68873/how-to-navigate-qplaintextedit-qtextbrowser

#INCLUDE <의 QApplication>
#INCLUDE <QPointer>
#INCLUDE <QVariant>
#INCLUDE <QtCore / QVariant>
#INCLUDE <QDebug>

QPointer <위젯> log_broswer;
보이드 outputMsg (QtMsgType 타입 QMessageLogContext CONST & QString 및 STR CONST) {
    log_broswer-> outputMsg (유형, STR);
}

{본체 (*는 argv [] INT는 argc, 숯)을 int로

    의 QApplication A (는 argc, ARGV);
    새로운 위젯 = log_broswer;
    log_broswer->) (표시;
    qDebug () << "안녕하세요 Qt는";
    qInstallMessageHandler (outputMsg);
    INT 결과 = () a.exec;
    삭제 log_broswer;
    결과를 반환;
}

#INCLUDE <는 QWidget>
#INCLUDE <QCloseEvent>
// # 포함 <인 QDialog>
#INCLUDE <QDir>
#INCLUDE <QFileSystemWatcher>
#INCLUDE <QHBoxLayout>
#INCLUDE <QMessageBox>
#INCLUDE <QProcess>
#INCLUDE <QPushButton을>
#INCLUDE <QTextBrowser>
#INCLUDE <QTimer>
#INCLUDE <QVBoxLayout>
#INCLUDE <QFileSystemWatcher>
#INCLUDE <QPlainTextEdit>
#INCLUDE <QMutex>

#INCLUDE <QtDebug>

네임 스페이스 UI {
클래스 위젯;
}

클래스 위젯 : 공공는 QWidget
{
     Q_OBJECT

  공공의:
    명시 위젯 (*는 QWidget 부모 = 0);
    ~ 위젯 ();

    보이드 outputMsg (QtMsgType 타입 QString & CONST MSG);

  공공 슬롯 :
    보이드 시작 ();
    (수 BOOL) 저장 무효;
    // 모니터 경로
    (QString 및 경로 CONST) dirUpdated 무효화;
  개인 슬롯 :

    보이드 on_pushButton_start_clicked ();
    보이드 on_pushButton_stop_clicked ();
    보이드 on_pushButton_save_clicked ();
    보이드 on_pushButton_exit_clicked ();
    보이드 readCmdInformation ();
    보이드 autoUpdata ();
    보이드 on_pushButton_update_clicked ();
    보이드 displayUdiskFileList ();

은밀한:
 // 공공의:
    Ui :: Widget * ui;
    QTextBrowser * 브라우저;
    QPlainTextEdit * plainTextEdit;
    QPushButton을 * START_BUTTON;
    QPushButton을 * stop_button;
    QProcess * my_process;
    QFileSystemWatcher * my_sysWatcher;
    QTimer * my_timer;
    부울은 is_finished;
    부울 my_saveEnable;
};

#endif 다음 // WIDGET_H

위젯 : 위젯 (는 QWidget * 부모)는 QWidget (부모)
                              ui (new Ui :: Widget) {
    UI-> setupUi (이);
    새로운 QTimer my_timer = ();
    새로운 QProcess my_process = (); // 다우 싱의 연합 과정
    //이 MSG를 보내드립니다 thereis 출력, 입력 MSG를 받아 들일 수받을 경우
    연결 (my_process, SIGNAL (readyRead ())이 슬롯 (readCmdInformation));

    새로운 QFileSystemWatcher my_sysWatcher = ();
    my_sysWatcher-> addPath ( "/ 데이터"); // 모니터 파일 경로
   // triger 때 파일 변경
    연결 (my_sysWatcher,
            SIGNAL (directoryChanged (QString)),
            이,
            SLOT (dirUpdated (QString)));


    is_finished = 거짓;
    my_saveEnable = 거짓;
    qDebug () << "INIT 위젯";
}

자기 창 // 읽기 정보 형태로 명령 행
무효 위젯 :: readCmdInformation () {
    QString STR = my_process-> readAllStandardOutput ();
    UI-> plainTextEdit-> appendPlainText (STR);
    UI-> plainTextEdit-> moveCursor (QTextCursor :: 끝);
}

// log.txt에 대한 모든 정보를 저장 열린 swithch
무효 위젯 : 저장 (수 BOOL)
{
   my_saveEnable = 활성화;

}
필요한 경우 // 테스트 scipt은 제거 할 수 있습니다
무효 위젯 :: 시작 () {

    qDebug는 ( "! % d의 시작"is_finished);
    대해 INT (I = 0; I <1000000; I ++) {
        만약 (! is_finished) {
            QCoreApplication :: processEvents ();
            qDebug () << QString ( "qDebug ::") APPEND (QString :: 번호 (i, 10)).;
        } 다른 {
            반환;
        }
    }
}
// 자동 업데이트 자동 간부 스크립트
무효 위젯 :: autoUpdata ()
{
    UI-> plainTextEdit-> appendPlainText ( "자동 업데이트가 시작 \ n");
   // my_process-> 시작 ( "을 / mnt / sda1과 / auto.sh");
}
무효 위젯 :: on_pushButton_start_clicked ()
{
    is_finished = 거짓;
    qDebug는 () << "클릭을 시작합니다!";
    this- 시작> ();

}
U 디스크 // 쇼 디렉토리 마운트의 필요성 지연
무효 위젯 :: displayUdiskFileList ()
{
    CONST QDir의 udir ( "/ MNT / sda1을");
    QStringList uDiskList = udirentryList (QDir :: NoDotAndDotDot | QDir :: AllDirs | QDir :: 파일);
    UI-> plainTextEdit-> appendPlainText (QString () setNum (uDiskList.length ()).);
    대해 INT (I = 0; I <uDiskList.length (); I ++)
    {
        UI-> plainTextEdit-> appendPlainText (uDiskList [1]);

    }

}

무효 위젯 :: on_pushButton_stop_clicked ()
{
    = 사실 is_finished;
}
무효 위젯 :: on_pushButton_exit_clicked ()
{
    this-> 닫기 ();
    이 삭제; //핵심
}

무효 위젯 :: on_pushButton_update_clicked ()
{
  this-> autoUpdata ();
}

무효 위젯 :: on_pushButton_save_clicked ()
{
   this-> 저장 (TRUE);
}
// GET 디버그 또는 경고 MSG
무효 위젯 :: outputMsg (QtMsgType 유형, CONST QString & MSG) {
    메시지를 QString;

    정적 QMutex 뮤텍스;
    () mutex.lock;
    스위치 (타입) {

    경우 QtDebugMsg :
        메시지는 QString = ( "디버그");
        단절;

    경우 QtWarningMsg :
        ( "경고") 메시지 = QString;
        단절;

    경우 QtCriticalMsg :
        메시지 = QString ( "중요");
        단절;

    경우 QtFatalMsg :
        메시지 = QString ( "치명적");
        단절;

    }
    UI-> plainTextEdit-> appendPlainText (message.append (MSG));
 // qDebug () << "here1 \ n으로 이동";
     UI-> plainTextEdit-> moveCursor (QTextCursor :: 끝) 결국 슬라이더 막대 // 끝
 // 표준 : : cout과 << "대기";
     경우 (my_saveEnable) {
            Qfile을 파일 ( "log.txt에");
            file.open (QIODevice : 쓰기 전용 | QIODevice :: 추가]);
            QTextStream의 text_stream (파일);
            << text_stream 메시지 << "\ R \ n ';
            file.flush ();
            file.close ();
       }
     () mutex.unlock;

}
(QString & 경로 const를) 무효 위젯 :: dirUpdated {
    CONST QDir 디렉토리 (경로);
    QStringList newEntryList = dir.entryList (
        QDir :: NoDotAndDotDot | QDir :: AllDirs | QDir :: 파일 :: QDir DirsFirst);

    경우 (newEntryList.contains ( "sda1을")) {
          UI-> plainTextEdit-> setPlainText ( "U 디스크가 장착되었습니다");
        발광 my_timer-> SINGLESHOT (2000,이 슬롯 (displayUdiskFileList ()));
          UI-> pushButton_update->는, setEnabled (TRUE);
    } 다른 {
         UI-> plainTextEdit-> setPlainText ( "U 디스크가 마운트 해제되었습니다");
         UI-> pushButton_update->에서 setEnabled (FALSE);
    }
}

추천

출처www.cnblogs.com/7star/p/12099753.html