如何在触发 QObject::connect 的代码中查明调用的位置:无法在 Qt5 中对类型的参数进行排队?

How can I pin-point the location of the call in my code that triggered QObject::connect: Cannot queue arguments of type in Qt5?

在我的 Qt5 应用程序中,我在 运行 时间从 Qt 本身收到一条日志消息,如下所示:

QObject::connect: Cannot queue arguments of type 'QHostAddress'

我知道如何使用 Q_DECLARE_METATYPE(QHostAddress) 宏或 qRegisterMetaType<QHostAddress>("QHostAddress") class 修复此消息的原因,这不是这个问题的目的。

我想知道的是,如何在我的代码中查明触发此消息的调用的确切位置

由于消息没有 file/line 编号,而且我似乎无法在 Qt5 本身内部设置调试器断点,所以我无法找出导致此消息的原因。

我创建了一个消息处理程序来捕获消息:

void myMessageHandler(QtMsgType type, const QMessageLogContext & logContext, const QString & msg)
{
    Q_UNUSED(logContext);

    switch (type) {
    case QtDebugMsg:
        std::cerr << qPrintable(QString("qDebug: %1").arg(msg)) << std::endl;
        break;
    case QtWarningMsg:
        std::cerr << qPrintable(msg) << std::endl;
        break;
    case QtCriticalMsg:
        std::cerr << qPrintable(QString("qCritical: %1").arg(msg)) << std::endl;
        break;
    case QtFatalMsg:
        std::cerr << qPrintable( QString("qFatal: %1").arg(msg) ) << std::end;
            abort();

    }
}

然后在 main 中安装消息处理程序:

int main() 
{
   qInstallMessageHandler(myMessageHandler);

// rest of main
}

然后我在警告案例上设置了一个断点。当遇到断点时,我沿着调用堆栈向上移动到触发警告的代码行。在我的一些应用程序中,我使用了 assert(false) 来代替,这样我就不会忘记设置断点。