为什么目录字符串丢失'/'将返回Qt中的父qdir

Kal*_*dos 5 qt

这可能是一个错误.请阅读webclectic答案.

如果QFileInfo(filename)丢失'/',QDir :: absolutePath将返回父字符串.如下代码.

QFileInfo file("e:/QtExample/mytest/out/res/res1/");
QFileInfo file_no("e:/QtExample/mytest/out/res/res1");

QDir dirFile = file.absoluteDir();
QDir dirFile_no = file_no.absoluteDir();

QString strDirFile = dirFile.absolutePath(); //"E:/QtExample/mytest/out/res/res1
QString strDirFile_no = dirFile_no.absolutePath(); //"E:/QtExample/mytest/out/res
Run Code Online (Sandbox Code Playgroud)

我用我的QTreeView找到了它.我的代码将从QTreeView :: clicked信号中调用插槽

connect(ui.m_pView,SIGNAL(clicked(QModelIndex)),this,SLOT(myClicked(QModelIndex)));
Run Code Online (Sandbox Code Playgroud)

插槽将获得QModelIndex,然后我使用QFileSystemMode :: fileInfo获取QFileInfo.

QFileInfo rFileInfo = m_model.fileInfo(index);
QDir absDir = rFileInfoDir.absoluteDir();    
Run Code Online (Sandbox Code Playgroud)

但是QFileInfo的返回总是返回"e:/ QtExample/mytest/out/res/res",所以如果我调用QFileInfo :: absoluteDir获取目录,则该目录是"res1"的父目录.所以我会得到错误的entrylst来自我的希望目录.

我应该在absoluteFilePath()之后添加'/'来获得正确的QDir吗?

为什么strDirPath等于"E:/ QtExample/mytest/out/res/res1",但rDir会列出"res"目录入口列表?

//rFileInfoDir == E:/QtExample/mytest/out/res/res1
QString strDirPath = rFileInfoDir.absoluteFilePath();
QDir rDir = rFileInfoDir.absoluteDir();
Run Code Online (Sandbox Code Playgroud)

pne*_*zis 2

如果您深入了解 absoluteDir()函数调用,您就会明白为什么会发生这种情况。在 Windows 中,调用fileName中的函数。qfsfileengine_win.cpp在这个函数中有这样的代码部分:

if (file == AbsolutePathName) {
        int slash = ret.lastIndexOf(QLatin1Char('/'));
        if (slash < 0)
            return ret;
        else if (ret.at(0) != QLatin1Char('/') && slash == 2)
            return ret.left(3);      // include the slash
        else
            return ret.left(slash > 0 ? slash : 1);
}
Run Code Online (Sandbox Code Playgroud)

您可以看到它返回最后一个分隔符左侧的字符串部分。我不知道这是期望的行为还是错误。也许你可以Qt为此发布一个错误。文件对此事并不清楚。