Как я могу точно определить местоположение вызова в моем коде, который вызвал 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), чтобы не забыть установить точку останова.

Другие вопросы по тегам