Портирование из Глиба в Qt
Я портирую приложение из Glib на Qt.
У меня есть много API, специфичных для Gtk, но трудно найти эквивалентные варианты в Qt. Я ищу альтернативу этим:
- g_path_get_basename
- g_path_get_dirname
- strdup
Любая идея?
2 ответа
Там действительно нет прямых эквивалентов для них, но это самое близкое, что вы получите:
g_path_get_basename
QString QFileInfo:: fileName () const
Возвращает имя файла, исключая путь.
Примечание: не поддавайтесь искушению аналогично вызванными baseName() и completeBaseName() в Qt, так как они не совпадают. Разработчики Qt и Glib решили использовать разные термины для одних и тех же вещей.
Кроме того, даже это не то же самое, потому что это не будет вести себя одинаково для пустых имен файлов или тех, которые заканчиваются косой чертой.
g_path_get_dirname
QString QFileInfo:: path () const
Возвращает путь к файлу. Это не включает имя файла.
Обратите внимание, что если этому объекту QFileInfo задан путь, заканчивающийся косой чертой, имя файла считается пустым, и эта функция будет возвращать весь путь.
Примечание: absolutePath () или canonicalPath() не будут работать, потому что они будут возвращать абсолютные пути, тогда как вариант glib возвращает относительные пути.
strdup
Просто используйте std::string
, std::array
или же QByteArray
, Не поддавайтесь искушению QString
будет таким же. Это просто не потому, что это, помимо всего прочего, также может привести к накладным расходам UTF.
Вот код для распечатки:
main.cpp
#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;
}
main.pro
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.