Портирование с Glib на Qt

Я портирую приложение из Glib на Qt.

У меня есть много API, специфичных для Gtk, но сложно найти эквивалентные варианты в Qt. Я ищу альтернативу этим:

  • g_path_get_basename
  • g_path_get_dirname
  • strdup

Любая идея?

3

Решение

Там действительно нет прямых эквивалентов для них, но это самое близкое, что вы получаете:

QString QFileInfo :: fileName () const

Возвращает имя файла, исключая путь.

Заметка: не поддавайтесь искушению так же называемым Basename () а также completeBaseName () в Qt как они есть не тот же самый. Разработчики Qt и Glib решили использовать разные термины для одних и тех же вещей.

Кроме того, даже это не то же самое, потому что оно не будет вести себя одинаково для пустых имен файлов или тех, которые заканчиваются косой чертой.

QString QFileInfo :: path () const

Возвращает путь к файлу. Это не включает имя файла.

Обратите внимание, что если этому объекту QFileInfo задан путь, заканчивающийся косой чертой, имя файла считается пустым, и эта функция будет возвращать весь путь.

Заметка: absolutePath () или же canonicalPath () не будет работать, потому что они будут возвращать абсолютные пути, тогда как вариант glib возвращает относительные пути.

Просто используйте 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"
5

Другие решения

Вы можете использовать QFileInfo для следующего:

g_path_get_basename => QFileInfo::baseName или же QFileInfo::completeBaseName

g_path_get_dirname => QFileInfo::path

strdup не нужен Просто использовать QString размещается в стеке в большинстве случаев. Qt API принимает QString.

1

По вопросам рекламы [email protected]