도구는 짧은 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); } }