从Glib移植到Qt

时间:2014-12-26 12:40:14

标签: c++ qt glib qtcore qfileinfo

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

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

  • g_path_get_basename
  • g_path_get_dirname
  • 的strdup

有什么想法吗?

2 个答案:

答案 0 :(得分:6)

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

g_path_get_basename

  

QString QFileInfo::fileName() const

     

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

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

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

g_path_get_dirname

  

QString QFileInfo::path() const

     

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

     

请注意,如果为此QFileInfo对象指定了以斜杠结尾的路径,则该文件的名称将被视为空,此函数将返回整个路径。

注意absolutePath()canonicalPath()无效,因为它们会返回绝对路径,而glib变量会返回相对路径。

的strdup

只需使用std::stringstd::arrayQByteArray即可。不要试图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"

答案 1 :(得分:1)

您可以使用QFileInfo进行以下操作:

g_path_get_basename =&gt; QFileInfo::baseNameQFileInfo::completeBaseName

g_path_get_dirname =&gt; QFileInfo::path

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