QFileDialog:文件夹名称在 windows 下出现两次
QFileDialog: folder name appears twice under windows
我想做的:简单地让用户 select 在 Qt UI.
中有一个目录
目前的代码:
QString dir = QFileDialog::getExistingDirectory(this, "Open directory",
QString::fromStdString(target_dir),
QFileDialog::ShowDirsOnly
| QFileDialog::DontResolveSymlinks);
这在 linux 下工作得很好。但是,当我为 windows 交叉编译它时,发生的是 returns some_path/directory/directory
而不是 some_path/directory
,那是 selected 目录的名称添加了两次。
如果我 select 文件夹并且只有当我进入文件夹时才会发生,这应该是用户能够做的事情。
原因可能是 QFileDialog 中通常包含文件名的行编辑包含文件夹名,并且在输入文件夹时不会自行清除(它在 linux 下执行)。
现在我可以编写一些例程,针对给定的 QString dir
检查它是否存在,如果不存在,如果最后两个文件夹相同,也会在没有最后一个文件夹的情况下尝试它。这是我的临时解决方案,但我不喜欢它,如果我能在部分 Qt 代码中解决这个问题。
出于兼容性原因,我必须使用 Qt 4.8.5。
使用搜索引擎没有找到任何关于此问题的信息。
有谁知道使这项工作有效的方法吗?毕竟这应该是Qt的一个很基础很简单的功能了
编辑:根据 p-a-o-l-o 的建议,我尝试删除标志,但遇到了同样的问题。然后我还测试了在没有静态函数的情况下这样做:
QFileDialog dialog;
dialog.setFileMode(QFileDialog::Directory);
QString dir = dialog.getExistingDirectory(this);
还是一样的问题。
编辑:我的临时解决方案,对于那些感兴趣的人:
QString find_next_valid_folder(const QString& path)
{
if(QDir(path).exists()) return path;
return find_next_valid_folder(path.left(path.lastIndexOf("/")));
}
如果你不介意重构,你可以有一个简单的 class 像这样:
#include <QFileDialog>
class XFileDialog : public QFileDialog
{
Q_OBJECT
QString _current;
public:
XFileDialog(QWidget * parent);
static QString getExistingDirectory(QWidget * parent = 0, const QString & caption = QString(), const QString & dir = QString(), QFileDialog::Options options = QFileDialog::ShowDirsOnly);
private slots:
void folderChanged(const QString &);
};
因此您可以跟踪 QFileDialog
信号:
XFileDialog::XFileDialog(QWidget * parent) : QFileDialog(parent)
{
connect(this, SIGNAL(currentChanged(const QString &)), this, SLOT(folderChanged(const QString &)));
}
在插槽中,您只需更新 _current
成员:
void XFileDialog::folderChanged(const QString & s)
{
if(s.isEmpty()) return;
_current = s;
}
并像这样实现 getExistingDirectory
方法:
QString XFileDialog::getExistingDirectory(QWidget * parent, const QString & caption, const QString & dir, QFileDialog::Options options)
{
XFileDialog dialog(parent);
dialog.setWindowTitle(caption);
dialog.setFileMode(QFileDialog::Directory);
dialog.setOptions(options);
dialog.setDirectory(dir);
if(dialog.exec() == QDialog::Accepted)
{
return dialog._current;
}
return QString();
}
注意静态函数 returns 用户导航到的最后一个已知路径。
现在您可以替换
QString dir = QFileDialog::getExistingDirectory(this, "Open directory",
QString::fromStdString(target_dir),
QFileDialog::ShowDirsOnly
| QFileDialog::DontResolveSymlinks)
和
QString dir = XFileDialog::getExistingDirectory(this, "Open directory",
QString::fromStdString(target_dir),
QFileDialog::ShowDirsOnly
| QFileDialog::DontResolveSymlinks)
我想做的:简单地让用户 select 在 Qt UI.
中有一个目录目前的代码:
QString dir = QFileDialog::getExistingDirectory(this, "Open directory",
QString::fromStdString(target_dir),
QFileDialog::ShowDirsOnly
| QFileDialog::DontResolveSymlinks);
这在 linux 下工作得很好。但是,当我为 windows 交叉编译它时,发生的是 returns some_path/directory/directory
而不是 some_path/directory
,那是 selected 目录的名称添加了两次。
如果我 select 文件夹并且只有当我进入文件夹时才会发生,这应该是用户能够做的事情。
原因可能是 QFileDialog 中通常包含文件名的行编辑包含文件夹名,并且在输入文件夹时不会自行清除(它在 linux 下执行)。
现在我可以编写一些例程,针对给定的 QString dir
检查它是否存在,如果不存在,如果最后两个文件夹相同,也会在没有最后一个文件夹的情况下尝试它。这是我的临时解决方案,但我不喜欢它,如果我能在部分 Qt 代码中解决这个问题。
出于兼容性原因,我必须使用 Qt 4.8.5。
使用搜索引擎没有找到任何关于此问题的信息。
有谁知道使这项工作有效的方法吗?毕竟这应该是Qt的一个很基础很简单的功能了
编辑:根据 p-a-o-l-o 的建议,我尝试删除标志,但遇到了同样的问题。然后我还测试了在没有静态函数的情况下这样做:
QFileDialog dialog;
dialog.setFileMode(QFileDialog::Directory);
QString dir = dialog.getExistingDirectory(this);
还是一样的问题。
编辑:我的临时解决方案,对于那些感兴趣的人:
QString find_next_valid_folder(const QString& path)
{
if(QDir(path).exists()) return path;
return find_next_valid_folder(path.left(path.lastIndexOf("/")));
}
如果你不介意重构,你可以有一个简单的 class 像这样:
#include <QFileDialog>
class XFileDialog : public QFileDialog
{
Q_OBJECT
QString _current;
public:
XFileDialog(QWidget * parent);
static QString getExistingDirectory(QWidget * parent = 0, const QString & caption = QString(), const QString & dir = QString(), QFileDialog::Options options = QFileDialog::ShowDirsOnly);
private slots:
void folderChanged(const QString &);
};
因此您可以跟踪 QFileDialog
信号:
XFileDialog::XFileDialog(QWidget * parent) : QFileDialog(parent)
{
connect(this, SIGNAL(currentChanged(const QString &)), this, SLOT(folderChanged(const QString &)));
}
在插槽中,您只需更新 _current
成员:
void XFileDialog::folderChanged(const QString & s)
{
if(s.isEmpty()) return;
_current = s;
}
并像这样实现 getExistingDirectory
方法:
QString XFileDialog::getExistingDirectory(QWidget * parent, const QString & caption, const QString & dir, QFileDialog::Options options)
{
XFileDialog dialog(parent);
dialog.setWindowTitle(caption);
dialog.setFileMode(QFileDialog::Directory);
dialog.setOptions(options);
dialog.setDirectory(dir);
if(dialog.exec() == QDialog::Accepted)
{
return dialog._current;
}
return QString();
}
注意静态函数 returns 用户导航到的最后一个已知路径。
现在您可以替换
QString dir = QFileDialog::getExistingDirectory(this, "Open directory",
QString::fromStdString(target_dir),
QFileDialog::ShowDirsOnly
| QFileDialog::DontResolveSymlinks)
和
QString dir = XFileDialog::getExistingDirectory(this, "Open directory",
QString::fromStdString(target_dir),
QFileDialog::ShowDirsOnly
| QFileDialog::DontResolveSymlinks)