C++ 将qDebug重定向到QTextEdit
我想使用C++ 将qDebug重定向到QTextEdit,c++,qt,C++,Qt,我想使用qInstallMessageHandler(handler)将qDebug重定向到QTextEdit 我在类中定义了一个处理函数: void Spider::redirect(QtMsgType type, const QMessageLogContext& context, const QString& msg) { console->append(msg); } 并在类(Spider)的构造函数中调用qInstallMessageHandler(重定
qInstallMessageHandler(handler)
将qDebug
重定向到QTextEdit
我在类中定义了一个处理函数:
void Spider::redirect(QtMsgType type, const QMessageLogContext& context, const QString& msg)
{
console->append(msg);
}
并在类(Spider)的构造函数中调用qInstallMessageHandler(重定向)
但是,当我编译这个程序时,我得到了一个错误:
无法从类型“void”转换“Spider::redirect”
(Spider::)(QtMsgType,const QMessageLogContext&,const QString&)'to
类型'QtMessageHandler{aka void(*)(QtMsgType,const
QMessageLogContext&,const QString&)}'
如果我在global中定义handler函数,就可以了
我无法找出这两种行为之间的区别。非静态类方法和全局函数具有不同的签名。不能将非静态方法用作函数。我非常喜欢这种调试功能。在过去的几个项目中,我已经做过几次了。下面是相关的代码片段 在mainwindow.h中的
mainwindow
类中,在public
static QTextEdit * s_textEdit;
在mainwindow.cpp中,在任何函数之外
QTextEdit * MainWindow::s_textEdit = 0;
在主窗口构造函数中
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()上方
在main.cpp中的main()内部,在初始化QApplication
实例之前
qInstallMessageHandler(myMessageOutput);
注意:这对于任何单线程应用程序都非常有效。一旦开始在GUI线程外部使用qDebug()
,您将崩溃。然后,您需要从任何线程函数(GUI线程上未运行的任何函数)创建一个QueuedConnection
,以连接到MainWindow::s_textEdit
的实例,如下所示:
QObject::connect(otherThread, SIGNAL(debug(QString)),
s_textEdit, SLOT(append(QString)), Qt::QueuedConnection);
如果您最终使用QDockWidget
s并使用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());
QMenu*菜单;
菜单=此->菜单栏()->添加菜单(“关于”);
菜单->设置对象名(菜单->标题());
//后来。。。
QDockWidget*dock;
dock=新的QDockWidget(“控制台”,本);
dock->setObjectName(dock->windowTitle());
dock->setWidget(s_textEdit);
s_textEdit->setReadOnly(真);
这->addDockWidget(Qt::RightDockWidgetArea,dock);
this->findChild(“About”)->addAction(dock->toggleViewAction());
希望这有帮助。向下投票,因为这并没有回答“如何将qDebug重定向到QTextEdit”的问题。这个答案解释了询问者为什么会出现错误,而不是如何解决询问者的问题。
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());