Как я могу точно определить местоположение вызова в моем коде, который вызвал QObject :: connect: Невозможно поставить в очередь аргументы типа в Qt5?

В моем приложении Qt5 я получаю сообщение журнала во время выполнения от самого Qt, которое выглядит так:

QObject :: connect: Невозможно поставить в очередь аргументы типа ‘QHostAddress’

Я знаю, как исправить причину этого сообщения, используя Q_DECLARE_METATYPE(QHostAddress) макро или qRegisterMetaType<QHostAddress>("QHostAddress") класс, это не то, о чем этот вопрос.

То, что я хочу знать, Как я могу указать точное местоположение вызова в моем коде, который вызвал это сообщение?

Так как сообщение не содержит номер файла / строки, и, похоже, я не могу установить точки останова отладчика внутри самого Qt5, я не могу выяснить, что вызывает это сообщение.

0

Решение

Я создаю обработчик сообщений для перехвата сообщений:

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), чтобы не забыть установить точку останова.

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]