Как получить текущее имя файла во фрагменте кода
Я пытаюсь создать фрагмент кода, который будет печатать некоторые журналы консоли с текущим именем файла и именем текущего метода / тега, как у нас systr
в затмении.
Хотя я могу добавить фрагмент кода в Инструменты> Параметры> Текстовый редактор> Фрагмент, я не смог найти тег для получения текущего имени файла.
Файл примера (TestMyUI.js):
function doSomething{
console.log("TestMyUI.doSomething()");
}
Здесь я хотел бы сгенерировать console.log
используя шаблон, сохраненный во фрагментах. Так что для каждого места я набираю что-то вроде consLog
он должен автоматически заполнять журнал, заполненный текущим файлом и именем метода. Это похоже на то, что мы имеем systr
в затмении IDE.
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
Если вы хотите получить эту информацию для файлов 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
Естественно, вы можете использовать массив заголовков, чтобы указать пользовательскую обработку, сохранять журналы в разные файлы, отправлять сетевые сообщения или электронные письма в пользовательских форматах или что угодно. Как только вы используете собственный обработчик, вы можете делать с сообщениями все, что захотите.