如何在我的代码中查明触发 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 中对类型的参数进行排队?的主要内容,如果未能解决你的问题,请参考以下文章