Qt
大约 5 分钟
Qt
目录
QDir类 - 路径问题
QDir
基本使用
头文件
#include <QDir> // 头文件
构造函数 & 返回QDir的函数
QDir(const QDir &dir) // 复制构造函数
QDir(const QString &path = QString()) // 根据路径名
QDir(const QString &path, const QString &nameFilter, QDir::SortFlags sort = SortFlags(Name | IgnoreCase), QDir::Filters filters = AllEntries)
QDir(qApp->applicationDirPath()) // 获取应用路径(指pro中DESTDIR的参)并构造QDir
QCoreApplication::applicationDirPath(); // 返回应用路径(同上?)
directoryOf("scripts"); // 访问应用程序的脚本子目录
QDir常用方法
小心中文路径
dirName(); // 路径最后文件夹的名字,返回QString
cdUp(); // cd到上一层
cd();
// 注意1:如果新目录不存在,则不会执行逻辑cd()操作!!!需要加判定
// 注意2:中文路径有可能导致cd失败!
QString QDir::absoluteFilePath(const QString &fileName) const; // 参数是文件名
QString QDir::absolutePath() const;
entryList方法
QStringList entryList(QDir::Filters filters = NoFilter, QDir::SortFlags sort = NoSort) const
// 媒体值(enum QDir::Filterflags / QDir::Filters)
QStringList entryList(const QStringList &nameFilters, QDir::Filters filters = NoFilter, QDir::SortFlags sort = NoSort) const
// 名字过滤、媒体值(enum QDir::Filterflags / QDir::Filters)
常见错误
// 注意1:如果新目录不存在,则不会执行逻辑cd()操作!!!需要加判定
// 注意2:中文路径有可能导致cd失败!
if(!dPath.cd(QString::fromLocal8Bit("./AppData/LocalLow/miHoYo/原神")))
{
qDebug()<<"Failed to cd the path."
<<dPath.absolutePath();
return "";
}
媒体值补充
Constant | Value | Description |
---|---|---|
QDir::Dirs | 0x001 | List directories that match the filters. |
QDir::AllDirs | 0x400 | List all directories; i.e. don't apply the filters to directory names. |
QDir::Files | 0x002 | List files. |
QDir::Drives | 0x004 | List disk drives (ignored under Unix). |
QDir::NoSymLinks | 0x008 | Do not list symbolic links (ignored by operating systems that don't support symbolic links). |
QDir::NoDotAndDotDot | NoDot | NoDotDot | Do not list the special entries "." and "..". |
QDir::NoDot | 0x2000 | Do not list the special entry ".". |
QDir::NoDotDot | 0x4000 | Do not list the special entry "..". |
QDir::AllEntries | Dirs | Files | Drives | List directories, files, drives and symlinks (this does not list broken symlinks unless you specify System). |
QDir::Readable | 0x010 | List files for which the application has read access. The Readable value needs to be combined with Dirs or Files. |
QDir::Writable | 0x020 | List files for which the application has write access. The Writable value needs to be combined with Dirs or Files. |
QDir::Executable | 0x040 | List files for which the application has execute access. The Executable value needs to be combined with Dirs or Files. |
QDir::Modified | 0x080 | Only list files that have been modified (ignored on Unix). |
QDir::Hidden | 0x100 | List hidden files (on Unix, files starting with a "."). |
QDir::System | 0x200 | List system files (on Unix, FIFOs, sockets and device files are included; on Windows, .lnk files are included) |
QDir::CaseSensitive | 0x800 | The filter should be case sensitive. |
Functions that
应用举例
一个应用的Demo —— 插件加载
QDir pluginsDir = QDir(qApp->applicationDirPath()); // 获取应用路径(指pro中DESTDIR的参)并构造QDir
if(!pluginsDir.cd("plugins")) return -1; // 查看是否存在plugins目录
foreach (QString fileName, pluginsDir.entryList(QDir::Files)) // 循环加载plugins目录中的插件,entryList返回QStingList
{
qDebug()<<fileName; // (调试用)
/* 里面返回目录中文件的绝对路径名,然后加载插件(加载插件需要绝对路径)*/
QPluginLoader pluginLoader(pluginsDir.absoluteFilePath(fileName));
// ...
}
另一个应用的Demo —— 脚本加载
void Calculaotr::createCustomButtons()
{
QDir scriptsDir = directoryOf("scripts"); // 访问应用程序的脚本子目录
QStringList fileNames = scriptsDir.entryList(QStringList("*.js"),QDir::Files); // 找.js扩展名的文件
foreach (QString fileName, fileNames){ // 循环脚本文件
QString text = fileName;
// ...
button->setProperty("scriptFileName", scriptsDir.absoluteFilePath(fileName));// 设置属性使用脚本(绝对路径)
// ...
}
}
获取路径
C++中获取路径
build构建路径
#include <QCoreApplication>
+QDir(qApp->applicationDirPath())
#include <QCoreApplication>
+QDir(QCoreApplication::applicationDirPath())
- 两种写法一样,默认是debug/release文件夹,受.pro的
DESTDIR = ../App
影响 - (win中cdUp后才是pro中的
./
路径,更不是源代码路径)
exe可执行文件路径
#include <QCoreAppliacation> QString strDirPath = QCoreApplication::applicationDirPath(); // 返回包含当前项目的可执行文件的路径 QString strFilePath = QCoreApplication::applicationFilePath(); // 返回可执行文件的路径
其他
QCoreApplication::applicationDirPth(); // 可执行文件所在目录 QcoreApplication::applicationFilePath(); // 可执行文件绝对路径 QcoreApplication::applicationName(); // 可执行文件名 QDir::currentPath(); // 当前程序运行目录
注意:工作路径和执行路径(可执行文件路径)的区别
有时打印出来这两是相同的,但其实这两个路径不一样
双击程序,程序是由explore启动的,工作目录和exe所在目录是同一个目录, 但是你用ide的调试器启动,他的启动是继承了ide本身设定的工作路径的,虽然这个路径也可以调 所以以执行文件所在的路径为基准,准不会错
系统默认的相对路径都是以执行文件所在目录为相对路径,而不是以工作目录为相对路径的
运行目录就是你执行文件所在目录 是固定不变的, 工作目录是一个环境变量 可在程序运行后随时进行设置更改 工作路径和启动器有关的 比如说 file.open(../a.txt); 这个a.txt文件的具体位置是根据工作目录来判断的
选用:一般不要用工作路径,用执行路径也就是exe路径
.pro中获取路径
- 路径宏
- 安装路径有关(QT_INSTALL开头)
$$[QT_INSTALL_PLUGINS]
,插件路径,D:\Soft\Dev\Tools\QT\5.15.2\msvc2019_64\plugins
$$[QT_INSTALL_EXAMPLES]
,示例路径,D:\Soft\Dev\Tools\QT\Examples\Qt-6.0.3
- 源代码路径有关
$$PWD
,指定指向包含正在解析的当前文件的目录的完整路径
- 构建路径有关
./
,和$$PWD
不同,前者是build路径(debug/release的上一层),后者是源代码项目路径
- 安装路径有关(QT_INSTALL开头)
根据不同系统选择编译文件夹
QDir pluginsDir(QCoreApplication::applicationDirPath());
#if defined(Q_OS_WIN)
if (pluginsDir.dirName().toLower() == "debug" || pluginsDir.dirName().toLower() == "release")
pluginsDir.cdUp();
#elif defined(Q_OS_MAC)
if (pluginsDir.dirName() == "MacOS") {
pluginsDir.cdUp();
pluginsDir.cdUp();
pluginsDir.cdUp();
}
#endif