Qfiledialog:文件夹名称在Windows下方出现两次
QFileDialog: folder name appears twice under windows
我想做的:只需让用户在qt UI中选择一个目录。
到目前为止的代码:
QString dir = QFileDialog::getExistingDirectory(this, "Open directory",
QString::fromStdString(target_dir),
QFileDialog::ShowDirsOnly
| QFileDialog::DontResolveSymlinks);
在Linux下,这可以正常工作。但是,当我为Windows进行编译时,发生的事情是,它不是some_path/directory
返回some_path/directory/directory
,那是添加了两次所选目录的名称。
如果我选择文件夹,并且仅在输入文件夹时才发生,则可以正常工作,这应该是用户可以做的事情。
这样做的原因可能是,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("/")));
}
如果您不介意重构,则可以拥有这样的简单类:
#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();
}
注意静态函数返回用户导航到的最后已知路径。
现在您可以替换
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)
相关文章:
- g++的分段错误(在NaN上使用to_string两次时)
- 蛇在C++不会连续转两次
- 检查一个数组是否包含在另一个数组中,以相反的顺序,至少两次
- 从具有按值捕获的 lambda 移动构造 std::函数时,移动构造函数调用两次
- 我应该如何去缓解两次出现的cin?
- Realloc 两次无法在 Visual Studio 上运行
- 使用 getline(cin, var) 两次在进行字符串比较时会产生错误 (==)
- 为什么映射插入和 map.find() 的单次迭代比插入和 map.find() 的两次单独迭代慢得多
- C++析构函数调用两次,堆栈分配的复合对象
- 为什么参数在构造 std::thread 时移动两次
- Qt插槽调用了两次
- 连续两次写入数字时出现逻辑错误 (C++)
- Qfiledialog:文件夹名称在Windows下方出现两次
- 检查模板参数在同类参数包中是否出现两次以上
- 矩阵移位两次时出现问题
- 正在从文件中读取最后两次出现的内容
- C++ cout 字符'return'文件中的字符出现两次
- 当我调用绑定的 c++ 类函数两次时出现 lua 错误?
- 出现至少两次的最长子字符串:c++ question
- 我如何打印4个不同字母组合成2个字母对的所有方式来填充4个位置,每个字母正好出现两次