Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/128.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/qt/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 将qDebug重定向到QTextEdit_C++_Qt - Fatal编程技术网

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());