Question

J'ai le besoin d'obtenir un ou plusieurs répertoires de l'utilisateur, et je suis en train d'utiliser QFileDialog pour cela, comme illustré ci-dessous.(à l'aide de QT 5.2)

Le problème est que si l'utilisateur navigue sur le bas d'un répertoire à partir de leur répertoire de départ, puis quand ils choisissent leurs répertoires, en plus de ces répertoires sélectionnés la boîte de dialogue renvoie le répertoire parent.Cela se produit uniquement pour les immédiate parent.Si ils surfent sur deux répertoires, ils ont encore que d'obtenir un parent supplémentaire d'entrée.Si leur dernière navigation était de remonter au répertoire précédent, ils n'ont rien parent supplémentaire d'entrée.

Ma question est la suivante:a) Est-ce un bug connu avec les QFileDialog?et b) Est-il un correctif/solution de contournement?

Le mieux que je peux penser est d'écrire du code pour comparer la première entrée sélectionnée à l'encontre de la seconde, et chuck si c'est le répertoire parent.

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;
}
Était-ce utile?

La solution

Le problème, comment je le vois, est en utilisant le mode de sélection de fichier boîte de dialogue de l'élément de points de vue, lorsqu'nouvelle sélection n'est pas désélectionner la sélection précédente.Ainsi, lorsque vous naviguez à travers la hiérarchie vers le bas, vous cliquez sur répertoire des nœuds avant de faire la sélection finale.Ainsi, vous accumulez des points supplémentaires.Ce que je propose, est à l'aide de QAbstractItemView::ContiguousSelection mode, qui permet de désélectionner les vieux de la sélection.Ainsi, votre code devrait ressembler à:

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

QTreeView *tree = dialog.findChild<QTreeView*>();
if (tree) {
    tree->setSelectionMode(QAbstractItemView::ContiguousSelection);
}
[..]
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top