是否有一种方法可以找到导致警告出现在QT中的线路

Is there a way to find the line that caused a warning to appear in Qt?

本文关键字:警告 线路 QT 一种 方法 是否      更新时间:2023-10-16

运行QT5项目时,我会收到

之类的警告
QObject::startTimer: Timers cannot be started from another thread

和其他。

虽然许多答案涵盖了给定代码中引起的警告或如何纠正它们的内容,但我想知道 where 是生成的警告。

这是因为我认为这是由于我对某些QT功能的错误用法引起的,该功能会在内部引起警告,例如在上述情况下,使用计时器执行的功能。知道行号有助于调试,但不幸的是,即使在调试模式下也没有显示。

有办法做到这一点吗?

这个问题似乎几乎是相同的,但是我没有观察到与那里的问题相似的东西 - 我看不到任何行号。如果适用,我不明白如何在那里应用答案。

谢谢。

最好的方法是设置一个断点,如其他提到的。

在Linux上,也可以在消息模式中包含回溯:

qSetMessagePattern("%{file}:%{line} - %{message}n%{backtrace depth=10 separator="n"}");

可以查看其文档,尤其是针对限制。示例输出:

/home/thomas/src/Qt/5.8-desktop/qtbase/src/corelib/kernel/qobject.cpp:1639 - QObject::startTimer: Timers can only be used with threads started with QThread
QObject::startTimer
QTimer::start
?myapp?
__libc_start_main
?myapp?

由于我没有与-rdynamic链接,因此main()函数在backtrace中不知道,而?myapp?则是打印的。

nwp,在评论中指出了纳瓦兹的答案,当我在警告消息线上放置一个断点时,它的功能很棒,此处:

case QtWarningMsg:
        fprintf(stderr, "Warning: %s (%s:%u, %s)n", localMsg.constData(), context.file, context.line, context.function); //break point here
        break;

在调试器模式下运行时,这给出了适当的追溯。