__LINE__ __FILE__ 或 qml 中的类似函数

Posted

技术标签:

【中文标题】__LINE__ __FILE__ 或 qml 中的类似函数【英文标题】:__LINE__ __FILE__ OR similar function in qml 【发布时间】:2016-12-27 07:14:18 【问题描述】:

我正在尝试打印调用函数、行号和文件名,而不会在 QML 中出于正常调试目的而引发错误。我可以按如下方式打印调用者函数名称

console.log("Caller Function Name"+arguments.callee.caller.name); 

【问题讨论】:

【参考方案1】:

您可以覆盖qInstallMessageHandler 默认函数并提供您的自定义函数,该函数还可以打印行号/调用者。您可以在链接文档中找到示例。另一个部分示例:

void loggingMessageHandler(QtMsgType type, const QMessageLogContext & context, const QString & msg)

    QString timeStr(QDateTime::currentDateTime().toString("dd-MM-yy HH:mm:ss:zzz"));
    QString contextString(QString("[%1  %2]").arg(context.file).arg(context.line));

    mutex.lock();

    QString level;
    if(logFile.isOpen())
    
        switch (type) 
        case QtInfoMsg:     level = QString("INF"); break;
        case QtDebugMsg:    level = QString("DEB"); break;
        case QtWarningMsg:  level = QString("WAR"); break;
        case QtCriticalMsg: level = QString("CRT"); break;
        case QtFatalMsg:    level = QString("FTL"); break;
        
        QTextStream stream(&logFile);
        stream << timeStr << " " << contextString << "\t"  << level << "\t"  << msg << endl;
        stream.flush();
    

#if defined(Q_OS_WIN)
    OutputDebugString(reinterpret_cast<const wchar_t *>(level.append(' ' + msg + '\n').utf16()));
#elif defined(Q_OS_android)
    android_default_message_handler(type, context, level.append(" " + msg));
#else   // MACX || ios || LINUX
    fprintf(stderr, "%s\n", level.append(" " + msg).toLocal8Bit().constData());
#endif
      mutex.unlock();

如果logFile 已打开,则日志数据将写入由QMutex 分隔的临界区中,否则将简单地输出到每个平台的标准输出。

无论您定义什么处理程序,它都可以与分类日志记录(自 Qt 5.2 起可用)结合使用,以轻松设置根据您的需要定制的自定义日志记录工具。您只需要定义您的日志类别,如this blog post 中所述,并调用qCDebugqCInfo()qCWarning() 等。根据活动类别(通过QLoggingCategory 的静态函数setFilterRules() 设置),可以打印或跳过不同的日志记录信息。

现在 Qt 5.8 可用,这尤其有趣。自此版本以来,您可以在 QML 中使用类别,即您可以调用 console 函数并传递类别,例如

function myFancyFunction() 
    // foo code
    console.log(myFancyCategory, "message");
    // bar code

此外,类别声明可以在 QML 中通过 ad hoc 类型 LoggingCategory 完全完成。

附录(Qt

建议的解决方案在 Qt 5.0+ 环境中工作,其类别完全可用于 Qt 5.3+ 和 Qt 5.8+ 中可用的 QML 类别;在 Qt 4.x 环境中,您应该覆盖 qInstallMsgHandler,但您没有 QMessageLogContext。这意味着您应该在处理程序之外管理文件/行信息,例如您必须使用 Q_FUNC_INFO 或依赖 C++ 中的 __FILE____LINE__(请注意,后者已在最新的 5.x 版本中被删除,例如讨论过的 here)。

【讨论】:

以上是关于__LINE__ __FILE__ 或 qml 中的类似函数的主要内容,如果未能解决你的问题,请参考以下文章

在不使用 #define 的情况下捕获 __LINE__ 和 __FILE__

__FILE__、__LINE__ 和 __FUNCTION__ 在 C++ 中的用法

C:_debug_printf,基于vsnprintf 或 vprintf实现带时间戳和源码信息(__FILE__,__FUNCTION__, __LINE__)的格式化打印输出

__FILE__,__LINE__

如何找到父函数的__FUNCTION__、__LINE__和__FILE__?

如何让__FILE __,__ func__和__LINE__宏在单行中工作?