我需要一个或多个 目录 从用户,我试图为此使用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;
}
有帮助吗?

解决方案

问题,我怎么看,是在使用特定的选择模式的文件对话框项目视图,当新的选择不取消选择以前的选择。因此,当您向下浏览层次结构时,请在进行最终选择之前单击目录节点。因此,你积累额外的项目。我的建议是用 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