跳至主要內容

Qt

LincZero大约 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 "";
}

媒体值补充

ConstantValueDescription
QDir::Dirs0x001List directories that match the filters.
QDir::AllDirs0x400List all directories; i.e. don't apply the filters to directory names.
QDir::Files0x002List files.
QDir::Drives0x004List disk drives (ignored under Unix).
QDir::NoSymLinks0x008Do not list symbolic links (ignored by operating systems that don't support symbolic links).
QDir::NoDotAndDotDotNoDot | NoDotDotDo not list the special entries "." and "..".
QDir::NoDot0x2000Do not list the special entry ".".
QDir::NoDotDot0x4000Do not list the special entry "..".
QDir::AllEntriesDirs | Files | DrivesList directories, files, drives and symlinks (this does not list broken symlinks unless you specify System).
QDir::Readable0x010List files for which the application has read access. The Readable value needs to be combined with Dirs or Files.
QDir::Writable0x020List files for which the application has write access. The Writable value needs to be combined with Dirs or Files.
QDir::Executable0x040List files for which the application has execute access. The Executable value needs to be combined with Dirs or Files.
QDir::Modified0x080Only list files that have been modified (ignored on Unix).
QDir::Hidden0x100List hidden files (on Unix, files starting with a ".").
QDir::System0x200List system files (on Unix, FIFOs, sockets and device files are included; on Windows, .lnk files are included)
QDir::CaseSensitive0x800The 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的上一层),后者是源代码项目路径

根据不同系统选择编译文件夹

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