Дополнительный нежелательный выбор из QFileDialog

StackOverflow https://stackoverflow.com//questions/25060868

  •  22-12-2019
  •  | 
  •  

Вопрос

Мне нужно получить один или несколько каталоги от пользователя, и я пытаюсь использовать для этого QFileDialog, как показано ниже.(с использованием QT 5.2)

Проблема в том, что если пользователь просматривает каталог из своего начального каталога, то, когда он выбирает свои каталоги, в дополнение к этим выбранным каталогам диалоговое окно возвращает родительский каталог.Это происходит только для немедленный родитель.Если они просматривают два каталога, они все равно получают только одну дополнительную родительскую запись.Если их последняя навигация заключалась в возврате к предыдущему каталогу, они не получают дополнительной родительской записи.

Мой вопрос здесь:а) Это известная ошибка в QFileDialog?и б) Есть ли исправление/обходной путь?

Лучшее, что я могу придумать, — это написать код для сравнения первой выбранной записи со второй и выбросить ее, если это родительский каталог.

QStringList open_directories (const std::string & start_dir) {
    QFileDialog dialog (0, "Import Load Directories", from_string(start_dir), QString());
    dialog.setFileMode(QFileDialog::DirectoryOnly);
    dialog.setOption(QFileDialog::DontUseNativeDialog,true);
    QListView *list = dialog.findChild<QListView*>("listView");
    if (list) {
     list->setSelectionMode(QAbstractItemView::MultiSelection);
    }

    QTreeView *tree = dialog.findChild<QTreeView*>();
    if (tree) {
        tree->setSelectionMode(QAbstractItemView::MultiSelection);
    }
    QStringList file_names;
    if (dialog.exec()) {
        file_names = dialog.selectedFiles();
    }
    return file_names;
}
Это было полезно?

Решение

Проблема, насколько я это вижу, заключается в использовании определенного режима выбора для представлений элементов диалогового окна файла, когда новый выбор не отменяет выбор предыдущего.Итак, когда вы перемещаетесь по иерархии вниз, вы нажимаете на узлы каталога, прежде чем сделать окончательный выбор.Таким образом вы накапливаете дополнительные предметы.Я предлагаю использовать QAbstractItemView::ContiguousSelection режим, который отменяет выбор старого выбора.Итак, ваш код должен выглядеть так:

[..]
if (list) {
    list->setSelectionMode(QAbstractItemView::ContiguousSelection);
}

QTreeView *tree = dialog.findChild<QTreeView*>();
if (tree) {
    tree->setSelectionMode(QAbstractItemView::ContiguousSelection);
}
[..]
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top