Qt QFileDialog中多余的不需要的选择

Qt QFileDialog中多余的不需要的选择,qt,qt5,Qt,Qt5,我需要从用户那里获取一个或多个目录,我正在尝试使用QFileDialog,如下所示。(使用Qt5.2) 问题是,如果用户从起始目录浏览一个目录,那么当他们选择自己的目录时,除了这些选定的目录之外,对话框还会返回父目录。这只会发生在直接父母身上。如果他们浏览两个目录,他们仍然只能得到一个额外的父条目。如果他们的最后一次导航是返回到上一个目录,那么他们不会得到额外的父条目 我的问题是:a)这是QFileDialog的已知错误吗?和b)是否有修复/解决方法 我能想到的最好方法是编写代码,将第一个选定条

我需要从用户那里获取一个或多个目录,我正在尝试使用QFileDialog,如下所示。(使用Qt5.2)

问题是,如果用户从起始目录浏览一个目录,那么当他们选择自己的目录时,除了这些选定的目录之外,对话框还会返回父目录。这只会发生在直接父母身上。如果他们浏览两个目录,他们仍然只能得到一个额外的父条目。如果他们的最后一次导航是返回到上一个目录,那么他们不会得到额外的父条目

我的问题是:a)这是QFileDialog的已知错误吗?和b)是否有修复/解决方法

我能想到的最好方法是编写代码,将第一个选定条目与第二个条目进行比较,如果它是父目录,则将其丢弃

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;
}
QStringList打开目录(const std::string和start\u dir){
QFileDialog对话框(0,“导入加载目录”,来自_string(start_dir),QString();
setFileMode(QFileDialog::DirectoryOnly);
setOption(QFileDialog::DontUseNativeDialog,true);
QListView*list=dialog.findChild(“listView”);
如果(列表){
list->setSelectionMode(QAbstractItemView::MultiSelection);
}
QTreeView*tree=dialog.findChild();
如果(树){
tree->setSelectionMode(QAbstractItemView::MultiSelection);
}
QStringList文件名;
if(dialog.exec()){
file_names=dialog.selectedFiles();
}
返回文件名;
}

我怎么看,问题在于在“文件”对话框项视图中使用特定的选择模式时,新选择没有取消选择以前的选择。因此,在向下浏览层次结构时,在进行最终选择之前,请单击目录节点。因此,您会累积额外的项目。我建议使用
qabstractemview::ContiguousSelection
模式,取消选择旧的选择。因此,您的代码应该如下所示:

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

QTreeView *tree = dialog.findChild<QTreeView*>();
if (tree) {
    tree->setSelectionMode(QAbstractItemView::ContiguousSelection);
}
[..]
[…]
如果(列表){
列表->设置选择模式(QAbstrationView::ContinguousSelection);
}
QTreeView*tree=dialog.findChild();
如果(树){
tree->setSelectionMode(QAbstratemView::ContinguousSelection);
}
[..]

尝试了这个,还有
扩展选择
,这正是我想要的。这两种模式似乎都没有
MultiSelection
的问题。由于这是一个很好的解决方案(事实上是一个更好的解决方案),我接受了这个答案。如果我不得不猜测一下,这可能是
多重选择
模式中的一个bug,以前没有人发现并抱怨过,主要是因为该模式很糟糕。模式文档甚至说“最常用的模式是SingleSelection和ExtendedSelection”,这隐含地告诉您“在其他地方,会有龙。”——)