Я портирую приложение из Glib на Qt.
У меня есть много API, специфичных для Gtk, но сложно найти эквивалентные варианты в Qt. Я ищу альтернативу этим:
Любая идея?
Там действительно нет прямых эквивалентов для них, но это самое близкое, что вы получаете:
QString QFileInfo :: fileName () const
Возвращает имя файла, исключая путь.
Заметка: не поддавайтесь искушению так же называемым Basename () а также completeBaseName () в Qt как они есть не тот же самый. Разработчики Qt и Glib решили использовать разные термины для одних и тех же вещей.
Кроме того, даже это не то же самое, потому что оно не будет вести себя одинаково для пустых имен файлов или тех, которые заканчиваются косой чертой.
QString QFileInfo :: path () const
Возвращает путь к файлу. Это не включает имя файла.
Обратите внимание, что если этому объекту QFileInfo задан путь, заканчивающийся косой чертой, имя файла считается пустым, и эта функция будет возвращать весь путь.
Заметка: absolutePath () или же canonicalPath () не будет работать, потому что они будут возвращать абсолютные пути, тогда как вариант glib возвращает относительные пути.
Просто используйте std::string
, std::array
или же QByteArray
, Не поддавайтесь искушению QString
будет таким же. Это просто не потому, что это, помимо всего прочего, также может привести к накладным расходам UTF.
Вот код для распечатки:
#include <QFileInfo>
#include <QDebug>
#include <QByteArray>
#include <iostream>
#include <glib.h>
using namespace std;
int main()
{
const char filePath[] = "tmp/foo.bar.baz";
qDebug() << "=========== Glib ===============\n";
cout << "Base name: " << g_path_get_basename(filePath) << endl;
cout << "Directory name: " << g_path_get_dirname(filePath) << endl;
cout << "String dup: " << strdup(filePath) << endl;
qDebug() << "\n=========== Qt =================\n";
QFileInfo fileInfo(filePath);
qDebug() << "File name:" << fileInfo.fileName();
qDebug() << "Directory name:" << fileInfo.path();
qDebug() << "String dup:" << QByteArray("foo.bar.baz");
return 0;
}
TEMPLATE = app
TARGET = main
QT = core
SOURCES += main.cpp
packagesExist(glib-2.0) {
CONFIG += link_pkgconfig
PKGCONFIG += glib-2.0
}
qmake && make && ./main
=========== Glib ===============
Base name: foo.bar.baz
Directory name: tmp
String dup: tmp/foo.bar.baz
=========== Qt =================
File name: "foo.bar.baz"Directory name: "tmp"String dup: "foo.bar.baz"
Вы можете использовать QFileInfo для следующего:
g_path_get_basename
=> QFileInfo::baseName
или же QFileInfo::completeBaseName
g_path_get_dirname
=> QFileInfo::path
strdup
не нужен Просто использовать QString
размещается в стеке в большинстве случаев. Qt API принимает QString.