本文介绍了如何在Visual Studio中查看qDebug()?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
在Qt Creator中,我可以直接在IDE中查看qDebug(),qWarning()等输出.我该如何在Visual Studio中做到这一点?
In Qt Creator, I could view the qDebug(), qWarning() etc. output directly in the IDE. How could I do this in Visual Studio?
推荐答案使用附加的调试器运行程序时,它将显示在Visual Studio的输出"窗口中,但是出于调试目的,我经常将调试输出重定向到某些一种不错的日志窗口,您可以使用功能qInstallMsgHandler:
When you run the program with an attached debugger, it will show in the Output Window of Visual Studio, but for Debug purposes i often redirect the debug output to some kind of nice log window, which you can do by using the function qInstallMsgHandler:
我使用的代码:
#include <qapplication.h> #include <qwidget.h> #include <qplaintextedit.h> #include <qmetaobject.h> #include <qthread.h> #include <qboxlayout.h> #include <qdatetime.h> #include <qdebug.h> #include <cstdio> #include <cassert> QWidget *DEBUG_MESSAGE_DISPLAY_WIDGET = NULL; QPlainTextEdit *DEBUG_MESSAGE_DISPLAY_TEXTEDIT = NULL; void setupDebugDisplay(); void debugMessageDisplayFunc(QtMsgType type, const char *msg); int main( int argc, char* argv[] ) { QApplication a( argc, argv ); a.setQuitOnLastWindowClosed( true ); setupDebugDisplay(); // your code here.... e.g: // YourMainWindow mainWindow; int ret = a.exec(); delete DEBUG_MESSAGE_DISPLAY_WIDGET; return ret; } void setupDebugDisplay() { QWidget *widget = new QWidget(); widget->setWindowTitle( "Debug Log" ); widget->setAttribute( Qt::WA_QuitOnClose, false ); //quit only when mainwindow is closed QBoxLayout* layout = new QVBoxLayout(); widget->setLayout( layout ); QPlainTextEdit *textEdit = new QPlainTextEdit( widget ); QFont font = QFont( "Monospace" ); font.setStyleHint(QFont::TypeWriter); textEdit->setFont( font ); textEdit->setReadOnly(true); layout->addWidget( textEdit ); widget->show(); DEBUG_MESSAGE_DISPLAY_WIDGET = widget; DEBUG_MESSAGE_DISPLAY_TEXTEDIT = textEdit; qInstallMsgHandler(debugMessageDisplayFunc); } void debugMessageDisplayFunc(QtMsgType type, const char *msg) { bool do_abort = false; const char* msgTypeStr = NULL; switch (type) { case QtDebugMsg: msgTypeStr = "Debug"; break; case QtWarningMsg: msgTypeStr = "Warning"; break; case QtCriticalMsg: msgTypeStr = "Critical"; break; case QtFatalMsg: msgTypeStr = "Fatal"; do_abort = true; default: assert(0); return; } QTime now = QTime::currentTime(); QString formattedMessage = QString::fromLatin1("%1 %2 %3") .arg(now.toString("hh:mm:ss:zzz")) .arg(msgTypeStr).arg(msg); // print on console: fprintf( stderr, "%s\n", formattedMessage.toLocal8Bit().constData() ); // print in debug log window { bool isMainThread = QThread::currentThread() == QApplication::instance()->thread(); if(DEBUG_MESSAGE_DISPLAY_TEXTEDIT) { if( isMainThread ) DEBUG_MESSAGE_DISPLAY_TEXTEDIT->appendPlainText( formattedMessage ); else // additional code, so that qDebug calls in threads will work aswell QMetaObject::invokeMethod( DEBUG_MESSAGE_DISPLAY_TEXTEDIT, "appendPlainText", Qt::QueuedConnection, Q_ARG( QString, formattedMessage ) ); } } }更多推荐
如何在Visual Studio中查看qDebug()?
发布评论