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