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