Как я могу точно определить местоположение вызова в моем коде, который вызвал QObject::connect: Невозможно поставить в очередь аргументы типа в Qt5?
В моем приложении Qt5 я получаю сообщение журнала во время выполнения от самого Qt, которое выглядит так:
QObject:: connect: Невозможно поставить в очередь аргументы типа 'QHostAddress'
Я знаю, как исправить причину этого сообщения, используя Q_DECLARE_METATYPE(QHostAddress)
макро или qRegisterMetaType<QHostAddress>("QHostAddress")
класс, это не то, о чем этот вопрос.
Что я хочу знать, так это как я могу точно указать точное местоположение вызова в моем коде, который вызвал это сообщение?
Так как сообщение не содержит номер файла / строки, и, похоже, я не могу установить точки останова отладчика внутри самого Qt5, я не могу выяснить, что вызывает это сообщение.
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();
}
}
Затем в основном установите обработчик сообщений:
int main()
{
qInstallMessageHandler(myMessageHandler);
// rest of main
}
Затем я установил точку останова в случае предупреждения. Когда достигается точка останова, я поднимаюсь по стеку вызовов до строки кода, которая вызвала предупреждение. В некоторых моих приложениях вместо этого я поставил assert(false), чтобы не забыть установить точку останова.