Pregunta

Tengo la necesidad de tener uno o más directorios desde el usuario, y estoy tratando de utilizar QFileDialog para esto, como se muestra a continuación.(el uso de QT 5.2)

El problema es que si el usuario se encuentre navegando por abajo de un directorio de su directorio de inicio, a continuación, cuando se seleccione sus directorios, además de los directorios seleccionados en el cuadro de diálogo devuelve el directorio padre.Esto sólo sucede para el inmediata el padre de familia.Si surf por dos directorios, todavía sólo obtener el extra de la entrada principal.Si su última navegación era volver al directorio anterior, no llega la extra de los padres de la entrada.

Mi pregunta aquí es:a) este Es un error conocido con el QFileDialog?y b) ¿hay una solución/solución?

Lo mejor que puedo pensar es escribir código para comparar la primera entrada seleccionada en contra de la segunda, y chuck se si es el directorio padre.

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;
}
¿Fue útil?

Solución

El problema, como yo lo veo, es en el uso específico de selección de modo de diálogo de archivo de las vistas, cuando la nueva selección no anule la selección de la selección anterior.Así que, cuando usted vaya a través de la jerarquía de abajo, haga clic en directorio de los nodos antes de realizar la selección final.Por lo tanto se acumulan elementos adicionales.Lo que yo propongo, es el uso de QAbstractItemView::ContiguousSelection de modo, que se anula la selección anterior.Así, el código debe ser similar:

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

QTreeView *tree = dialog.findChild<QTreeView*>();
if (tree) {
    tree->setSelectionMode(QAbstractItemView::ContiguousSelection);
}
[..]
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top