100分求助~QT程序设计,加入宏Q_OBJECT后编译不成功

100分求助~QT程序设计,加入宏Q_OBJECT后编译不成功,第1张

直接qmake工程文件, 然后用Makefile就可以了, g++ moc ld都是全自动的. 定义过的函数在cpp里面要实现, 即使是空的也要写出来. 信号一定不要去写实现, 交给moc做

在QT中,我们经常使用 qDebug() 、 qInfo() 等来打印调试信息,但是当打印信息过多时,很不利于查找阅读。所以本文介绍使用 QtMessageHandler 类中的 qInstallMessageHandler() 来自定义处理调试信息。

一、在主线程中注册调试信息处理回调

这里的 outputMessage 即为自定义的触发函数,当程序有调试信息时,将会调用此函数

二、实现触发函数

说明:此函数需要接受三个参数

QtMsgType type :表示调试信息类型,包括 QtDebugMsg (调试消息)、 QtInfoMsg (信息消息)、 QtWarningMsg (警告消息和可恢复的错误)、 QtCriticalMsg (关键错误和系统错误)、 QtFatalMsg (致命错误)

const QMessageLogContext &context :表示有关日志消息的其他信息,比如文件名 context.file 、行号 context.line 等等。

const QString &msg :表示原始的调试信息。

这样,我们就可以根据调试信息类型,自定义处理调试信息,并打印到日志文件等等。

但是有时候,我们会有这样的需求,有些类型的信息需要打印到屏幕,而有些类型的信息需要打印到日志。当注册了调试信息处理的回调,如何分类去处理呢?

查看QT文档中对于 qInstallMessageHandler() 的描述,可以知道该函数返回一个指向上一个消息处理程序,可以理解为上一个消息处理函数的指针。因此在使用 qInstallMessageHandler() 注册回调时,可以保存函数的返回,从而用之前的处理程序来处理调试信息

例如:

使用 s_messageHandler 来保存函数的返回值,即指向了上一个消息处理函数。在 outputMessage() 函数中使用 s_messageHandler

这样就实现了将Info等信息打印到日志,而debug信息打印到屏幕。

注: 以上写入日志文件的写法,并不是线程安全的,需要加锁来保证线程安全,这里就不再赘述。

正常的运行程序,日志内容如下:

实际项目中遇到了编译出的Release版本,日志输出没有文件信息、行数的问题。如下:

解决方法:

在.pro文件中添加宏

一定要先删除掉之前编译的中间文件,重新qmake!这样就可以在Release版本中正确输出日志信息。

Qt是一个跨平台的C++图形用户界面(GUI)库。Qt提供了一个统一的编码方案,即Unicode编码。Unicode编码是一种跨平台的字符编码方案,它可以表示世界上所有的文字。Qt在源代码中提供了一个宏定义,即UNICODE宏,用于指定程序使用的编码方式。如果在编译时定义了UNICODE宏,那么程序将使用Unicode编码方式来进行编码,如果没有定义,那么程序将使用平台默认的编码方式。通常来说,UNICODE宏定义位于Qt的头文件中,例如qglobal.h文件。您可以通过查看该文件来了解具体的定义方式。


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/bake/11416166.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-15
下一篇 2023-05-15

发表评论

登录后才能评论

评论列表(0条)

保存