我非常喜欢拥有这种调试能力,我在最近几个项目中已经用了几次。以下是相关的代码片段。
在MainWindow
类下的public
中的mainwindow.h
文件中:
static QTextEdit * s_textEdit;
在mainwindow.cpp中,不在任何函数之内
QTextEdit * MainWindow::s_textEdit = 0;
在 MainWindow 构造函数中
s_textEdit = new QTextEdit;
// be sure to add the text edit into the GUI somewhere,
// like in a layout or on a tab widget, or in a dock widget
在 main.cpp 文件中,main()
函数之前。
void myMessageOutput(QtMsgType type, const QMessageLogContext &context, const QString &msg)
{
if(MainWindow::s_textEdit == 0)
{
QByteArray localMsg = msg.toLocal8Bit();
switch (type) {
case QtDebugMsg:
fprintf(stderr, "Debug: %s (%s:%u, %s)\n", localMsg.constData(), context.file, context.line, context.function);
break;
case QtWarningMsg:
fprintf(stderr, "Warning: %s (%s:%u, %s)\n", localMsg.constData(), context.file, context.line, context.function);
break;
case QtCriticalMsg:
fprintf(stderr, "Critical: %s (%s:%u, %s)\n", localMsg.constData(), context.file, context.line, context.function);
break;
case QtFatalMsg:
fprintf(stderr, "Fatal: %s (%s:%u, %s)\n", localMsg.constData(), context.file, context.line, context.function);
abort();
}
}
else
{
switch (type) {
case QtDebugMsg:
case QtWarningMsg:
case QtCriticalMsg:
// redundant check, could be removed, or the
// upper if statement could be removed
if(MainWindow::s_textEdit != 0)
MainWindow::s_textEdit->append(msg);
break;
case QtFatalMsg:
abort();
}
}
}
在main.cpp的main()函数内,在初始化QApplication
实例之前。
qInstallMessageHandler(myMessageOutput);
注意:这对于任何单线程应用程序都非常有效。一旦您在GUI线程之外使用qDebug()
,应用程序将崩溃。然后,您需要从任何非运行在GUI线程上的函数(任何不运行在GUI线程上的东西)创建一个QueuedConnection
,以连接到您的MainWindow::s_textEdit
实例,如下所示:
QObject::connect(otherThread, SIGNAL(debug(QString)),
s_textEdit, SLOT(append(QString)), Qt::QueuedConnection)
如果您最终使用 QDockWidget
并利用 QMenu
,那么您可以做一些额外的很棒的事情。最终结果是一个非常用户友好、易于管理的控制台窗口。
QMenu * menu;
menu = this->menuBar()->addMenu("About");
menu->setObjectName(menu->title());
// later on...
QDockWidget *dock;
dock = new QDockWidget("Console", this);
dock->setObjectName(dock->windowTitle());
dock->setWidget(s_textEdit);
s_textEdit->setReadOnly(true);
this->addDockWidget(Qt::RightDockWidgetArea, dock);
this->findChild<QMenu*>("About")->addAction(dock->toggleViewAction());
希望这有所帮助。