我想做什么:只需让用户在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("/")));
}
答案 0 :(得分:1)
如果您不介意重构,则可以有一个像这样的简单类:
#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)