0

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

QObject::connect: 不能对类型为“QHostAddress”的参数进行排队

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

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

由于该消息没有附带文件/行号,并且由于我似乎无法在 Qt5 本身内设置调试器断点,因此我无法找出导致此消息的原因。

4

1 回答 1

1

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

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),所以我不会忘记设置断点。

于 2017-12-04T00:22:43.913 回答