如何在触发 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) 来代替,这样我就不会忘记设置断点。
在我的 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) 来代替,这样我就不会忘记设置断点。