QDirModel - Wie versch. Ordner auflisten?

Alles rund um die Programmierung mit Qt
Antworten
tribari
Beiträge: 63
Registriert: 23. Juli 2008 13:31
Wohnort: Braunschweig

QDirModel - Wie versch. Ordner auflisten?

Beitrag von tribari »

Hallo liebe QT-Gemeinde,

ich würde gern mein QDirModel dazu bringen mehrere Ordner anzuzeigen. Diese Verzeichnisse liegen im Grunde in einem gesammelten Überverzeichnis, jedoch möchte ich nicht alle Verzeichnisse von dort anzeigen lassen.

Code: Alles auswählen

dir
|_ subdir A
|_ subdir A2
|_ subdir A3
|_ subdir B
|_ subdir C
Ich möchte gerne nur die Verzeichnisse A* anzeigen lassen - bloss leider bekomme ich dies nicht hin.
Da diese Verzeichnisse alle mit derselben Zeichenkette beginnen (A*) - hatte ich versucht den rootIndex auf das überverzeichnis zu legen - und dann einen Filter anzulegen mit setNameFilter.
Dies hat leider nicht geklappt - da wohl, wie ich rausgefunden habe, dann auch Dateien gefiltert werden.

Gebt mir mal einen Denkanstoß wie ich mein Problem lösen kann ;-)

Nen eigenes QAbstractItemModel zu entwerfen, scheint mir etwas viel Aufwand für dieses simple Problem :-/ (auch habe ich dies noch nie gemacht ^^).

Ich danke schonmal im Vorraus für die Hilfe.

lg

Tribari
upsala
Beiträge: 3946
Registriert: 5. Februar 2006 20:52
Wohnort: Landshut
Kontaktdaten:

Beitrag von upsala »

Zum einen würde ich ein QFileSystemModel verwenden, zum anderen ein QSortFilterProxyModel zwischen dein Model und der View schalten.
tribari
Beiträge: 63
Registriert: 23. Juli 2008 13:31
Wohnort: Braunschweig

Beitrag von tribari »

okay - QFileSystemModel steht mir derzeit wohl nicht zur Verfügung, da ich noch Qt Version 4.3.4 verwende.
Aber ich mache mich mal über QSortFilterProxyModel schlau - danke für den Hinweis ;-)
tribari
Beiträge: 63
Registriert: 23. Juli 2008 13:31
Wohnort: Braunschweig

Beitrag von tribari »

So - hab diesbezüglich dann gleich wieder nen Problem - oder nen Denkfehler :D

Code: Alles auswählen

QDirModel* pDirModel = new QDirModel();
QTreeView* pTreeView = new QTreeView( this );
QSortFilterProxyModel* pProxyModel = new QSortFilterProxyModel( this );

pProxyModel->setSourceModel( pDirModel ); 
pTreeView->setModel( pProxyModel );

pTreeView->setRootIndex ( proxyModel->mapFromSource( pDirModel->index( "D:/temp" ) ) );
D:\temp wäre das Verzeichnis wo meine Ordner liegen...

Nun zeigt mein TreeView auch nur den Inhalt von D:\temp an - klappt.


Nun versuche ich aber zu filtern - ich möchte schliesslich nur die Verzeichnisse die mit "A" anfangen sehen (und deren Inhalt dann natürlich).

Code: Alles auswählen

pProxyModel->setFilterWildcard( "A*" );
pProxyModel->setFilterKeyColumn( 0 );
An dieser Stelle bin ich leider recht unsicher - wie ich da vorgehen soll ... jedenfalls ist das Ergebnis das in meiner TreeView garnichts mehr angezeigt wird :roll:

Wo liegt mein Denkfehler?
upsala
Beiträge: 3946
Registriert: 5. Februar 2006 20:52
Wohnort: Landshut
Kontaktdaten:

Beitrag von upsala »

Ich würde den Filter überladen, da du ja nur in einer Ebene filtern willst.
tribari
Beiträge: 63
Registriert: 23. Juli 2008 13:31
Wohnort: Braunschweig

Beitrag von tribari »

Okay habs hinbekommen - war zwar etwas mehr recherche als gedacht - aber am Ende hab ich einen Weg gefunden.

Nun würde ich noch gerne wissen, ob es möglich ist, mit dem QSortFilterProxyModel meine Verzeichnisse unter anderem Namen im View darstellen zu lassen?

Daten zB in D:\temp:

Code: Alles auswählen

|_ A1
    |_ ...
|_ A2
    |_ ...
|_ A3
    |_ ...
|_ B1
    |_ ...
|_ B2
    |_ ...
Nun erhalte ich nach etwas arbeit folgende Ausgabe in meiner View, das ist schonmal genau das was ich wollte:

Code: Alles auswählen

|_ A1
    |_ ...
|_ A2
    |_ ...
|_ A3
    |_ ...
Ist es nun möglich mit dem QSortFilterProxyModel die obersten Verzeichnisse unter anderem Namen darzustellen?

zB:

Code: Alles auswählen

|_ Testfall A1
    |_ ...
|_ Testfall A2
    |_ ...
|_ Testfall A3
    |_ ...
Wahrscheinlich nicht oder? ;-)
upsala
Beiträge: 3946
Registriert: 5. Februar 2006 20:52
Wohnort: Landshut
Kontaktdaten:

Beitrag von upsala »

Nur mit sehr viel Aufwand.
Antworten