[gelöst] QListView/QDirModel select Balken wie Win. Explorer

Alles rund um die Programmierung mit Qt
Antworten
lordofthebrain
Beiträge: 25
Registriert: 5. März 2006 16:49
Kontaktdaten:

[gelöst] QListView/QDirModel select Balken wie Win. Explorer

Beitrag von lordofthebrain »

Hallo,

folgendes Problem. Hab ein QDirModel erstellt und zeige diese in einem QListView an. Das ganze sieht so aus:
Bild

Es geht mir hier um den blauen Select-Balken. Der geht bis zum Ende der QListView. Kann man irgendwo einstellen / programmieren, dass dieser nur so lang wie die Datei / Ordner ist. Also so:
Bild

Ich erwarte keinen vollständigen Code. Aber ich steig durch die ganze Menge an Möglichkeiten nicht mehr durch. Bin für jeden kleinen Tipp oder Ansatz dankbar.

Vielen Dank.
Gruß Fabian
Zuletzt geändert von lordofthebrain am 14. Dezember 2007 15:28, insgesamt 1-mal geändert.
upsala
Beiträge: 3946
Registriert: 5. Februar 2006 20:52
Wohnort: Landshut
Kontaktdaten:

Beitrag von upsala »

Der Balken wird vom Delegate gezeichnet, also eigenes Delegate erstellen.
lordofthebrain
Beiträge: 25
Registriert: 5. März 2006 16:49
Kontaktdaten:

Zufällig gelöst :D

Beitrag von lordofthebrain »

So, für mein Problem oben gibts folgende Lösung und zwar ohne Delegate.
Qt Version 4.3, weiß nicht ob das mit älteren auch geht.

Code: Alles auswählen

.h Datei

class dirListView : public QListView
{
	protected:
	void mousePressEvent (QMouseEvent *);  
	QRect visualRect (const QModelIndex &) const;
	
	public:
	dirListView(QWidget *);
	~dirListView() {}
};

Code: Alles auswählen

.cpp Datei

dirListView::dirListView(QWidget * parent = 0 ): QListView(parent) 
{
	setGeometry(20,50,491,201); // Kann man natürlich auch weglassen oder modifizieren
}

// Nur wichtig, damit auch nur makiert wird innerhalb des Elementes. Siehe Windows Explorer.
void dirListView::mousePressEvent ( QMouseEvent * event)
{	
	QModelIndex index=indexAt(event->pos());
	clearSelection();
	if(index.isValid())
	{
		setSelection(visualRect(index),QItemSelectionModel::Select);
		setCurrentIndex(index);
	}
	else
		setCurrentIndex(QModelIndex());		
}


QRect dirListView::visualRect (const QModelIndex & index) const
{
	QRect result = rectForIndex(index); // Erzeugt ein Rect in der Größe des zu selektierenden Objects (Folder / Datei) 
	
        // Dieser Block ist wenn runter gescrollt wird, dass die Elemente richtig angezeigt werden.
        int dx = -horizontalOffset();
        int dy = -verticalOffset();
        result.adjust(dx, dy, dx, dy);
        return result;
}
Das ganze bassiert auf flow=QListView::TopToBottom und viewMode = QListView::ListMode. Für andere Ansichten müsste man visualRect entsprechend modifizieren.

Gruß Fabian
Antworten