我正在尝试打印调用函数,行号和文件名,而不会在QML中为正常的调试目的抛出错误。我可以按如下方式打印来电者姓名
console.log("Caller Function Name"+arguments.callee.caller.name);
答案 0 :(得分:8)
您可以覆盖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中所述,然后调用qCDebug
,qCInfo()
,qCWarning()
等。根据活动类别(通过setFilterRules()
的静态函数QLoggingCategory
设置),可以打印或跳过不同的日志记录信息。
现在Qt 5.8可用,这一点特别有趣。自此版本开始,您可以在QML 中使用 类别,即您可以调用console
个函数并传递一个类别,例如
function myFancyFunction() {
// foo code
console.log(myFancyCategory, "message");
// bar code
}
此外,类别声明可以通过ad hoc类型LoggingCategory
在QML中完全完成。
建议的解决方案适用于Qt 5.0+环境,其中的类别完全可用于Qt 5.8+和Qt 5.8+中提供的QML类别;在Qt 4.x环境中,您应该覆盖qInstallMsgHandler
,但您没有QMessageLogContext
。这意味着你应该管理处理程序之外的文件/行信息,例如您必须在C ++中使用Q_FUNC_INFO
或依赖__FILE__
和__LINE__
(请注意,在最新的5.x版本中已删除了后者,例如here所述。)< / p>