3

我正在将应用程序从 Glib 移植到 Qt。

我确实有很多特定于 Gtk 的 API,但是很难在 Qt 中找到等效的变体。我正在寻找这些的替代品:

  • g_path_get_basename
  • g_path_get_dirname
  • strdup

任何想法?

4

2 回答 2

6

这些确实没有直接的等价物,但这是您得到的最接近的:

g_path_get_basename

QString QFileInfo::fileName() 常量

返回文件的名称,不包括路径。

注意:不要被 Qt 中类似的baseName()completeBaseName()所吸引,因为它们并不相同。Qt 和 Glib 开发人员决定对相同的事物使用不同的术语。

此外,即使这也不相同,因为它对于空文件名或以斜杠结尾的文件名的行为方式不同。

g_path_get_dirname

QString QFileInfo::path() 常量

返回文件的路径。这不包括文件名。

注意,如果给这个 QFileInfo 对象一个以斜杠结尾的路径,文件名被认为是空的,这个函数将返回整个路径。

注意absolutePath()canonicalPath()将不起作用,因为它们将返回绝对路径,而 glib 变体返回相对路径。

strdup

只需使用std::string,std::arrayQByteArray。不要受到诱惑,那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"
于 2014-12-26T13:17:24.170 回答
1

您可以将 QFileInfo 用于以下内容:

g_path_get_basename=>QFileInfo::baseNameQFileInfo::completeBaseName

g_path_get_dirname =>QFileInfo::path

strdup不需要。QString在大多数情况下,只需使用在堆栈上分配。Qt API 采用 QString。

于 2014-12-26T12:48:07.910 回答