如何知道哪个QObject :: connect失败

时间:2018-03-16 11:43:14

标签: qt qt-creator signals-slots qobject

我有一个带有数十个信号槽连接的应用程序,特别是多个类(带分解)正在向插槽实现几乎相同的QObject::connect信号,我在QtCreator 应用程序输出中遇到的问题有时会出现问题,我得到了通常的错误:

  

QObject :: connect:无法连接   (null):: SessionClosed()to   mainWindow_Desktop :: stop_Scanning()

但它没有任何关于错误来自哪个文件/行或代码段的指示,而且我必须检查所有类似的连接以检测哪一个出错! 我的问题是:我有没有办法直接知道错误引用的文件/行

2 个答案:

答案 0 :(得分:2)

QMessageLogger::warningQMessageLogger::critical等设置断点。然后,您可以通过qWarningqCritical等来自Qt的此类消息停止您的应用,并且调用堆栈将告诉您它们的来源。

示例代码:

#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

我们可以看到connecttest.cpp:5的错误调用发生在f()的{​​{1}}。

答案 1 :(得分:2)

QMetaObject::Connection QObject::connect()有一个返回值,它附带一个隐式bool转换运算符,因此您可以使用if语句简单地测试它是否成功,如果需要,可以发出警告,告诉您它在何处如果启用了详细警告,则会发生。

当然,您可以自己手动使用__FILE____LINE____FUNCTION__宏。