如何在代码段中获取当前文件名

时间:2018-06-13 03:28:28

标签: qt qt4 qt-creator code-snippets

我正在尝试创建一个代码片段,该代码片段将打印一些控制台日志,其中包含当前文件名和当前方法/标记名称,就像我们在eclipse中systr的方式一样。

虽然我可以在工具>中添加代码段。选项>文本编辑器> Snippet ,我找不到任何标签来检索当前文件名。

示例文件(TestMyUI.js):

function doSomething{
console.log("TestMyUI.doSomething()");
}

在这里,我想使用保存在代码段中的模板生成console.log。因此,对于每个我输入类似consLog的地方,它必须自动完成填充当前文件和方法名称的日志。这与我们在eclipse IDE中的systr类似。

2 个答案:

答案 0 :(得分:2)

添加到@dtech的答案:

恢复文件,行和功能已经是Qt中不可或缺的一部分。您所要做的就是正确使用它。不需要代码段来执行此操作,因为所有这些信息已由console.log收集,但默认情况下未显示。您现在要做的就是告诉Qt使其可见。

比创建自定义消息处理程序更容易的方法是简单地注册消息模式(请参见qSetMessagePattern)。通过此功能,您可以注册一个模式,该模式可用于格式化通过QDebug(包括QML)记录的所有内容。一个简单的例子:

int main(int argc, char **argv) {
    qSetMessagePattern("%{file}:%{line} %{function} -> %{if-category}%{category}: %{endif}%{message}");

    QGuiApplication app(argc, argv);
    // ...
}

现在在您的QML文件中只需记录任何内容,就可以了。例如,以下代码:

function doSomething() {
    console.log("test");
}

此示例的输出(使用实际的测试文件创建):

qrc:/TestMyUI.js:11 doSomething -> qml: test

答案 1 :(得分:1)

如果要获取有关QML文件的信息并将其集成到输出中,可以使用

qInstallMessageHandler(QtMessageHandler handler)

安装您自己的消息处理程序功能。在该函数内部,您将拥有一个QMessageLogContext引用,该引用将使您可以访问更多信息,例如文件名,行号,函数名等。

void msgHandler(QtMsgType type, const QMessageLogContext &context, const QString &msg) {
  static QTextStream ts(stdout);
  static const char * err[] = {"", "WARNING: ", "ERROR!: ", "FATAL: ", ""};
  QString m = QString(err[type]) + context.category + "/" + context.file + "@" + QString::number(context.line) + "-" + context.function + ": " + msg;  
  ts << msg << endl;
}

现在,您可能不想以这种方式处理所有消息,并将其限制为某种特定的模式,可以通过在消息字符串中包含特定的“标头”并检查特定的消息是否包含该特定的“消息头”来轻松实现。否,请继续进行。例如:

console.log("test") // regular msg
console.log("?test") // custom msg handling

自然地,您可以使用标头数组来指定自定义处理,将日志保存到其他文件,以自定义格式发送网络消息或电子邮件或任何其他形式。一旦使用了自定义处理程序,就可以随心所欲地处理消息。