QFileDialog: имя папки появляется дважды под окнами - PullRequest
2 голосов
/ 12 марта 2019

Что я хочу сделать: просто попросите пользователя выбрать каталог в пользовательском интерфейсе Qt.

Код на данный момент:

QString dir = QFileDialog::getExistingDirectory(this, "Open directory",
                                                QString::fromStdString(target_dir),
                                                QFileDialog::ShowDirsOnly
                                                | QFileDialog::DontResolveSymlinks);

Это прекрасно работает под Linux.Однако, когда я кросс-компилирую его для Windows, происходит то, что вместо some_path/directory возвращается some_path/directory/directory, то есть имя выбранного каталога добавляется дважды.

Работает нормально, если я выбираюпапка и происходит только при входе в папку, что должен делать пользователь.

Причиной этого может быть то, что строка edit, которая в QFileDialog обычно содержит имя файла, здесь содержитимя папки и не очищает себя, когда папка вводится (что она делает под linux).

Теперь я мог бы написать некоторую подпрограмму, которая для данного QString dir проверяет, существует ли она, и если нет, и если последнийдве папки идентичны и пробует без последней папки.Это моё временное решение, но мне оно не нравится, я бы предпочел, чтобы я мог решить это внутри частей кода Qt.

По соображениям совместимости я должен использовать Qt 4.8.5.

Ничего не найдено по этому вопросу с помощью поисковых систем.

Кто-нибудь знает способ заставить эту работу?В конце концов, это должна быть очень элементарная и простая функция Qt.

Редактировать: Учитывая рекомендации от paolo, я попытался удалить флаги, у меня была та же проблема.Затем я также проверил это без статической функции:

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("/")));
}

1 Ответ

1 голос
/ 12 марта 2019

Если вы не возражаете против рефакторинга, у вас может быть простой класс, подобный этому:

    #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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...