2012-06-25 151 views

回答

5

当您使用附加的调试器运行程序时,它将显示在Visual Studio的输出窗口中,但出于调试目的,我经常将调试输出重定向到某种漂亮的日志窗口,您可以通过使用功能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)); 
    } 
    } 
} 
0

它重定向到visual studio的输出窗口。

+3

在所有情况下都不是这样的 –

7

还有一个更简单的方法:

转到项目属性>链接>系统:设置子系统 “子系统:CONSOLE”

当您运行程序时,您将获得一个控制台,并且qDebug()将被重定向到它。 (你也可以使用std :: cout)

+2

非常奇怪的建议。如果我有一个Win32应用程序,并且/ SUBSYSTEM:WINDOWS是一个强制选项,该怎么办? – Dalamber

相关问题