__LINE__ __FILE__或qml中的类似功能

Sou*_*Kus 5 qt qml qtquick2

我试图打印调用函数,行号和文件名,而不会在QML中为正常的调试目的抛出错误.我可以按如下方式打印来电者姓名

console.log("Caller Function Name"+arguments.callee.caller.name); 
Run Code Online (Sandbox Code Playgroud)

BaC*_*Zzo 9

您可以覆盖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();
}
Run Code Online (Sandbox Code Playgroud)

如果logFile打开,则记录数据被写入由临界区域中的记录数据,QMutex否则它只是输出到每个平台的标准输出.

无论您定义的处理程序是什么,它都可以与分类日志记录(从Qt 5.2开始提供)结合使用,轻松设置根据您的需求定制的自定义日志记录工具.你只需要定义日志类别,如在本博客文章,并呼吁qCDebug,qCInfo(),qCWarning()等等.根据活动类别(通过静态功能setFilterRules()设置QLoggingCategory),可以打印或跳过不同的日志信息.

现在Qt 5.8可用,这一点特别有趣.由于此版本中,您可以使用类别以QML,即你可以调用console函数,并沿着一个类别,如通

function myFancyFunction() {
    // foo code
    console.log(myFancyCategory, "message");
    // bar code
}
Run Code Online (Sandbox Code Playgroud)

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

ADDENDUM(Qt <5.0)

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