Портирование из Глиба в 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.

Другие вопросы по тегам