来自QFileDialog的额外不需要的选择

时间:2014-07-31 14:00:55

标签: qt qt5

我需要从用户那里获得一个或多个目录,并且我尝试使用QFileDialog,如下所示。 (使用QT 5.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;
}

1 个答案:

答案 0 :(得分:1)

我看到的问题是,当新选择未取消选择先前的选择时,文件对话框项目视图使用特定选择模式。因此,当您在层次结构中向下导航时,在进行最终选择之前单击目录节点。因此,您累积了其他项目。我建议使用QAbstractItemView::ContiguousSelection模式取消选择旧的选择。因此,您的代码应如下所示:

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

QTreeView *tree = dialog.findChild<QTreeView*>();
if (tree) {
    tree->setSelectionMode(QAbstractItemView::ContiguousSelection);
}
[..]