Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/139.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 从Glib到Qt的移植_C++_Qt_Glib_Qtcore_Qfileinfo - Fatal编程技术网

C++ 从Glib到Qt的移植

C++ 从Glib到Qt的移植,c++,qt,glib,qtcore,qfileinfo,C++,Qt,Glib,Qtcore,Qfileinfo,我正在将一个应用程序从Glib移植到Qt 我确实有很多特定于Gtk的API,但很难在Qt中找到等效的变体。我正在寻找以下替代方案: g\u路径\u获取\u基名称 g\u路径\u获取\u目录名 标准 有什么想法吗?您可以使用QFileInfo进行以下操作: g\u path\u get\u basename=>QFileInfo::basename或QFileInfo::completedbasename g\u path\u get\u dirname=>QFileInfo::path st

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

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

  • g\u路径\u获取\u基名称
  • g\u路径\u获取\u目录名
  • 标准

有什么想法吗?

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

g\u path\u get\u basename
=>
QFileInfo::basename
QFileInfo::completedbasename

g\u path\u get\u dirname
=>
QFileInfo::path


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

这些函数确实没有直接等价,但这是最接近的:

g\u路径\u获取\u基名称

返回文件名,不包括路径

注意:不要被Qt中类似调用的和所诱惑,因为它们不一样。Qt和Glib开发人员决定对同一事物使用不同的术语

而且,即使是这也不一样,因为对于空文件名或以斜杠结尾的文件名,其行为方式也不一样

g\u路径\u获取\u目录名

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

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

注意:or将不起作用,因为它们将返回绝对路径,而glib变量返回相对路径

标准 只需使用
std::string
std::array
QByteArray
。不要认为
QString
是相同的。这并不是因为这也会带来UTF开销

下面是一些代码来打印这些内容:

main.cpp 构建并运行 输出
前两个建议是错误的,我认为第四个也是错误的。你自己测试过吗?真奇怪,有人会投错误的答案!如果需要精确等价,或者您只是怀疑需要精确等价,我建议编写辅助函数,它与这些GTK函数具有完全相同的行为(辅助函数可能仍然使用
QString
,而不是GTK首选的字符串类型)。
#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"