Seite 1 von 1

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

Verfasst: 1. Dezember 2007 22:44
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

Verfasst: 1. Dezember 2007 23:36
von upsala
Der Balken wird vom Delegate gezeichnet, also eigenes Delegate erstellen.

Zufällig gelöst :D

Verfasst: 14. Dezember 2007 15:26
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