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

Posted

技术标签:

【中文标题】如何在我的代码中查明触发 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? 【发布时间】:2017-12-04 00:07:30 【问题描述】:

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

QObject::connect: 无法将“QHostAddress”类型的参数排队

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

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

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

【问题讨论】:

我安装了一个消息处理程序并在警告消息上设置了一个断点。我会回答的。 其实我已经有消息处理程序了,我过去也这样做过,但它太丑了! 我在这里问了一个子问题:***.com/questions/47624759/… 作为一种快速替代方法:在您的环境中将 QT_FATAL_WARNINGS 设置为 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),所以我不会忘记设置断点。

【讨论】:

以上是关于如何在我的代码中查明触发 QObject::connect 的调用的位置:无法在 Qt5 中对类型的参数进行排队?的主要内容,如果未能解决你的问题,请参考以下文章

查明是不是存在默认查看器

如何在我的应用程序视图中显示地图?

pl sql触发器如何比较触发器中的列值

一旦在我的代码中触发警报,有没有办法让 requestCode 脱离待处理的意图?

如何在 Xcode 中通过代码触发按钮

如何在 React 中触发 useCallback