Seite 1 von 1

QFileSystemModel/QListView, automatische Auswahl eines Eintrags

Verfasst: 15. Oktober 2018 08:01
von Wolfram
Hallo allerseits,

ich habe eine Frage in Zusammenhang mit dem QFileSystemModel, bei dem ich nicht weiterkomme.
Für die Anzeige von Verzeichnissen und Dateien setze ich einen TreeView und einen ListView mit jeweils einem QFilSystemModel (benannt als m_dirModel und m_fileModel) ein.
Beim Wechsel des Verzeichnisses wird über das onChanged Ereignis des dazugehörigen selectionModels das anzuzeigende Verzeichnis neu gesetzt:

QModelIndex ix = m_fileModel->setRootPath(verzeichnis);
ui->listViewFiles->setRootIndex(ix);

Das klappt soweit alles, die Verzeichnisinhalte werden angezeigt.
Wie kann ich jetzt aber erreichen, dass der erste Eintrag in der Verzeichnisanzeige (in meinem Fall ein Icon, dass ich über einen QFileIconProvider erstellt habe) unmittelbar ausgewählt wird? Es sollen nämlich in dem Moment gleich zugehörige Informationen angezeigt werden. Das klappt momentan nur, wenn ich im Anschluß an den Verzeichniswechsel ein Icon im ListView explizit auswähle und so wiederum über das onChanged Event dessen selectionModels weitergehe.

Hänge da leider im Moment fest, daher Danke für jeden Tip!
Gruß, Wolfram

Re: QFileSystemModel/QListView, automatische Auswahl eines Eintrags

Verfasst: 15. Oktober 2018 19:33
von Christian81
Mit setCurrentIndex() kann man den aktuellen Index (und indirekt so auch die Selektion) setzen -> http://doc.qt.io/qt-5/qabstractitemview ... rrentIndex

Re: QFileSystemModel/QListView, automatische Auswahl eines Eintrags

Verfasst: 16. Oktober 2018 13:49
von Wolfram
Hallo Christian,

Danke dir. Das hatte ich in der Doku schon gefunden und damit rumprobiert. Aber es gelingt mir nicht, an den ersten Eintrag bzw Index im ListView zu kommen. Zumindest erfolgt im onChange Event des Selection Models keinerlei Reaktion.

besten Gruß, Wolfram

Re: QFileSystemModel/QListView, automatische Auswahl eines Eintrags

Verfasst: 16. Oktober 2018 17:33
von Christian81
Ein QListView hat keine Hierarchie also sollte der erste Eintrag mit model->index(0,0, QModelIndex()) erreichbar sein. Außer natürlich da ist noch ein ProxyModel dazwischen oder so. Um mehr sagen zu können bräuchte man etwas Code.

Re: QFileSystemModel/QListView, automatische Auswahl eines Eintrags

Verfasst: 17. Oktober 2018 07:20
von Wolfram
Hallo Christian,
die Signal/Slot Verbindungen werden zu Beginn gesetzt...

---
connect(ui->treeViewDirs->selectionModel(),
SIGNAL(currentChanged(const QModelIndex& , const QModelIndex&)), this,
SLOT(onCurrentDirectoryChanged(const QModelIndex& , const QModelIndex&)));

connect(ui->listViewFiles->selectionModel(),
SIGNAL(currentChanged(const QModelIndex& , const QModelIndex&)), this,
SLOT(onCurrentFileChanged(const QModelIndex& , const QModelIndex&)));
---

und die Ereignisse sollen dann im Prinzip wie im Folgenden behandelt werden.
(Am markierten Bereich habe ich inzwischen soviel rumprobiert, dass wahrscheinlich gar nix mehr stimmt)

void MainWindow::onCurrentDirectoryChanged( const QModelIndex & current, const QModelIndex & previous )
{
Q_UNUSED(previous);
if (current.isValid()) {
QString sPath = mDirModel->fileInfo(current).absoluteFilePath();
ui->listViewFiles->setRootIndex(mFileModel->setRootPath(sPath));

QModelIndex ix= ui->listViewFiles->model()->index(0,0,QModelIndex());
ui->listViewFiles->selectionModel()->select( ix, QItemSelectionModel::Select );

}
}

void MainWindow::onCurrentFileChanged( const QModelIndex & current, const QModelIndex & previous )
{
Q_UNUSED(previous);
if (current.isValid()) {
QString sPath = mFileModel->fileInfo(current).absoluteFilePath();
qDebug() << sPath;
}
}

Gruß, Wolfram

Re: QFileSystemModel/QListView, automatische Auswahl eines Eintrags

Verfasst: 17. Oktober 2018 19:32
von Christian81
Hast Du das mit setCurrentIndex() mal ausprobiert?

Re: QFileSystemModel/QListView, automatische Auswahl eines Eintrags

Verfasst: 19. Oktober 2018 18:16
von Wolfram
Brachte leider auch nichts. Aber inzwischen hat es sich geklärt, der Fehler lag wohl in der Zeile

QModelIndex ix= ui->listViewFiles->model()->index(0,0,QModelIndex());

Richtig wäre

QModelIndex ix= ui->listViewFiles->model()->index(0,0, ui->listViewFiles->rootIndex());

Damit wird dann auf das erste Element ausgehend vom aktuellen Verzeichnis zugegriffen.

Danke nochmals und Gruß, Wolfram

Re: QFileSystemModel/QListView, automatische Auswahl eines Eintrags

Verfasst: 20. Oktober 2018 09:07
von Christian81
Stimmt, Du setzt ja den rootIndex neu, also ist root in dem Fall nicht QModelIndex(). Das habe ich nicht bedacht :)