Qfiledialog:文件夹名称在Windows下方出现两次

QFileDialog: folder name appears twice under windows

本文关键字:方出现 两次 Windows 文件夹 Qfiledialog      更新时间:2023-10-16

我想做的:只需让用户在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)