如何知道哪个 QObject::connect 失败
How to know which QObject::connect is failing
我有一个有数十个信号槽连接的应用程序,特别是多个 类(分解)正在实现几乎相同的 QObject::connect
信号槽,我面临的问题有时是, QtCreator 应用程序输出,我得到了通常的错误:
QObject::connect: Cannot connect
(null)::SessionClosed() to
mainWindow_Desktop::stop_Scanning()
但它没有任何指示错误来自哪个 file/line 或代码段,其代价是我必须检查所有类似的连接以检测哪个出错了!
我的问题是:我有什么办法可以直接知道file/line错误指的是?
在 QMessageLogger::warning
、QMessageLogger::critical
等上设置断点。然后您的应用程序会因来自 Qt 的 qWarning
、qCritical
等消息而停止,调用堆栈会告诉您它们的来源。
示例代码:
#include <QObject>
void f()
{
QObject::connect(0,"kkk",0,"aaa");
}
int main()
{
f();
}
编译后,当我用 GDB 运行 时,我得到:
$ gdb -ex 'set breakpoint pending on' -ex 'b QMessageLogger::warning' \
-ex r -ex bt ./test
Reading symbols from ./test...done.
Function "QMessageLogger::warning" not defined.
Breakpoint 1 (QMessageLogger::warning) pending.
Starting program: /tmp/test/test
[Thread debugging using libthread_db enabled]
Using host libthread_db library "/lib/x86_64-linux-gnu/libthread_db.so.1".
Breakpoint 1, QMessageLogger::warning (this=this@entry=0x7fffffffd2e0, msg=msg@entry=0x7ffff7c3ac80 "QObject::connect: Cannot connect %s::%s to %s::%s") at global/qlogging.cpp:541
541 {
#0 QMessageLogger::warning (this=this@entry=0x7fffffffd2e0, msg=msg@entry=0x7ffff7c3ac80 "QObject::connect: Cannot connect %s::%s to %s::%s") at global/qlogging.cpp:541
#1 0x00007ffff7b64a4d in QObject::connect (sender=0x0, signal=0x400838 "kkk", receiver=<optimized out>, method=<optimized out>, type=<optimized out>) at kernel/qobject.cpp:2618
#2 0x0000000000400788 in f () at test.cpp:5
#3 0x00000000004007a0 in main () at test.cpp:10
在这里我们可以看到对 connect
的错误调用发生在 test.cpp:5
中 f()
。
QMetaObject::Connection QObject::connect()
有一个 return 值,它带有一个隐式 bool 转换运算符,因此您可以简单地使用 if
语句测试它是否成功,并在必要时发出警告如果启用了详细警告,它可以告诉您它发生在哪里。
您当然可以自己手动使用 __FILE__
、__LINE__
和 __FUNCTION__
宏。
我有一个有数十个信号槽连接的应用程序,特别是多个 类(分解)正在实现几乎相同的 QObject::connect
信号槽,我面临的问题有时是, QtCreator 应用程序输出,我得到了通常的错误:
QObject::connect: Cannot connect (null)::SessionClosed() to mainWindow_Desktop::stop_Scanning()
但它没有任何指示错误来自哪个 file/line 或代码段,其代价是我必须检查所有类似的连接以检测哪个出错了! 我的问题是:我有什么办法可以直接知道file/line错误指的是?
在 QMessageLogger::warning
、QMessageLogger::critical
等上设置断点。然后您的应用程序会因来自 Qt 的 qWarning
、qCritical
等消息而停止,调用堆栈会告诉您它们的来源。
示例代码:
#include <QObject>
void f()
{
QObject::connect(0,"kkk",0,"aaa");
}
int main()
{
f();
}
编译后,当我用 GDB 运行 时,我得到:
$ gdb -ex 'set breakpoint pending on' -ex 'b QMessageLogger::warning' \
-ex r -ex bt ./test
Reading symbols from ./test...done.
Function "QMessageLogger::warning" not defined.
Breakpoint 1 (QMessageLogger::warning) pending.
Starting program: /tmp/test/test
[Thread debugging using libthread_db enabled]
Using host libthread_db library "/lib/x86_64-linux-gnu/libthread_db.so.1".
Breakpoint 1, QMessageLogger::warning (this=this@entry=0x7fffffffd2e0, msg=msg@entry=0x7ffff7c3ac80 "QObject::connect: Cannot connect %s::%s to %s::%s") at global/qlogging.cpp:541
541 {
#0 QMessageLogger::warning (this=this@entry=0x7fffffffd2e0, msg=msg@entry=0x7ffff7c3ac80 "QObject::connect: Cannot connect %s::%s to %s::%s") at global/qlogging.cpp:541
#1 0x00007ffff7b64a4d in QObject::connect (sender=0x0, signal=0x400838 "kkk", receiver=<optimized out>, method=<optimized out>, type=<optimized out>) at kernel/qobject.cpp:2618
#2 0x0000000000400788 in f () at test.cpp:5
#3 0x00000000004007a0 in main () at test.cpp:10
在这里我们可以看到对 connect
的错误调用发生在 test.cpp:5
中 f()
。
QMetaObject::Connection QObject::connect()
有一个 return 值,它带有一个隐式 bool 转换运算符,因此您可以简单地使用 if
语句测试它是否成功,并在必要时发出警告如果启用了详细警告,它可以告诉您它发生在哪里。
您当然可以自己手动使用 __FILE__
、__LINE__
和 __FUNCTION__
宏。