delgate für rahmen einer qtableview

Alles rund um die Programmierung mit Qt
Antworten
Chri
Beiträge: 100
Registriert: 23. Juni 2017 12:32

delgate für rahmen einer qtableview

Beitrag von Chri »

Hi
Um die Rahmen in einer tableview mit einem delegate zu machen, kann man ja drawline verwenden.
Bequemer wäre es mit drawRect. Das hier funktioniert:

Code: Alles auswählen

void paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const
      {
//       painter->drawRect(option.rect);//RAHMEN um jede Zelle
          if((index.row() == 4) && index.column() == 4)  painter->drawRect(rechteck);
...
Was auch funktioniert:

Code: Alles auswählen

QRect rechteck(option.rect.left() , option.rect.top(),80.0, 60.0);
if((index.row() == 4) && index.column() == 4)  painter->drawRect(rechteck);
Nun möchte ich aber von der Zelle 4/4 ausgehend (links oben) ein Rechteck bis zur Zelle 8/8 (rechts unten) spannen.
Wie geht das?

Und eine Zusatzfrage:
drawline zeichnet die Linie innerhalb der Zelle, drawRect zeichnet sie genau zwischen den Zellen.
Das schaut unschön aus, wenn sich drawline und drawrect an einer Zellenseite begegnen (Doppelter Strich).
Was tun, dass drawline auch genau zwischen den Zellen zeichnet?


LG
Chri
Die Sprache des Technikers ist die Skizze
Chri
Beiträge: 100
Registriert: 23. Juni 2017 12:32

Re: delgate für rahmen einer qtableview

Beitrag von Chri »

Ok, da keine Antwort kommt, habe ich es selbst gemacht:

Code: Alles auswählen

void rahmrec(int aze, int asp, int eze, int esp, QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const
{  //a...Anfangspunkt, e...Endpunkt, jeweils Zeile ze, Spalte sp
 if(index.row()== aze) //OBEN
 if(index.column() >= asp && index.column() <= esp) painter->drawLine(option.rect.topLeft(),option.rect.topRight() );

 if(index.row()== eze) //UNTEN
 if(index.column() >= asp && index.column() <= esp) painter->drawLine(option.rect.bottomLeft(),option.rect.bottomRight() );

 if(index.column()== asp)  //LINKS
 if(index.row() >= aze && index.row() <= eze) painter->drawLine(option.rect.topLeft(),option.rect.bottomLeft() );

 if(index.column()== esp)  //RECHTS
 if(index.row() >= aze && index.row() <= eze) painter->drawLine(option.rect.topRight(),option.rect.bottomRight() );
}
Aufgerufen wird es im Delegate, z.B.:

Code: Alles auswählen

rahmrec(2,0,14,4,painter,option,index);
Analoges hab ich für horizontale und vertikale Rahmen.

Ich nehme nicht an, dass ich der einzige bin, der Tabellen mit Rahmen stylen will - hätte angenommen, dass es da schon etwas Fertiges gibt und nicht jeder für sich alleine herum tut....

LG
Chri
Die Sprache des Technikers ist die Skizze
Chri
Beiträge: 100
Registriert: 23. Juni 2017 12:32

Re: delgate für rahmen einer qtableview

Beitrag von Chri »

Habe folgende Funktion gemacht:
(aze, azsp: Startzelle Zeile, Spalte und eze, ezsp: (diagonale) Endzelle Zeile, Spalte)

Code: Alles auswählen

void rahmrec(int aze, int asp, int eze, int esp, QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const
{
 if(index.row()== aze) //OBEN
 if(index.column() >= asp && index.column() <= esp) painter->drawLine(option.rect.topLeft(),option.rect.topRight()+QPoint(1,0) );

 if(index.row()== eze) //UNTEN
 if(index.column() >= asp && index.column() <= esp) painter->drawLine(option.rect.bottomLeft()+QPoint(0,1),option.rect.bottomRight()+QPoint(1,1) );

 if(index.column()== asp)  //LINKS
 if(index.row() >= aze && index.row() <= eze) painter->drawLine(option.rect.topLeft(),option.rect.bottomLeft() );

 if(index.column()== esp)  //RECHTS
 if(index.row() >= aze && index.row() <= eze) painter->drawLine(option.rect.topRight()+QPoint(1,0),option.rect.bottomRight()+QPoint(1,0) );
}
Aufruf im delegate:

z.B

Code: Alles auswählen

rahmrec(1,0,14,12,painter,option,index);
Analoge Funktionen habe ich für Rahmen links, rechts, oben, unten.

Dazu noch eine Frage:
Wenn ich auf diese Art 2 aneinander grenzende Rechtecksbereiche einrahme, werden die gemeinsamen Rahmenelemente doppelt gezeichnet.
Optisch ist es kein Problem mehr (...QPoint...), ist es ein Performance oder sonstiges Problem (Wenn es sehr oft vorkommt) ?

LG
Chri
Die Sprache des Technikers ist die Skizze
Volker75
Beiträge: 59
Registriert: 8. April 2009 21:04

Re: delgate für rahmen einer qtableview

Beitrag von Volker75 »

Sieht von der Geschwindigkeit erstmal harmlos aus.
Ich sehe keine verschachtelten Iterationen, keine Rekursion und keinen Code bei dem mir auf Anhieb eine einfachere Lösung einfällt.

Ich stelle mir solche Geschwindigkeitsfragen auch oft und gehe wie folgt vor:
Ich habe mir einen Datensatz erstellt, welchen in der Praxis real ist und wohl "groß" ist. Diese Daten habe ich verzehnfacht.
Mit diesem Datensatz teste ich regelmäßig beim Programmieren.
Der Test reicht mir meisten schon aus um beurteilen zu können, ob ich:
- doch eine andere Lösung zum Programmieren finden muss
- notfalls das neue Feature nur optional mache (Auswahl über eine Checkbox)
- notfalls ein QProgressbar einfüge

Unregelmäßig, aber auch ein guter Hinweis auf Performance:
Test mit valgrind. ( http://valgrind.org/ ) Damit schlage ich zwei Fliegen auf einmal: Ein kleiner Test, ob ich nicht illegale Speicherzugriffe mache und gleichzeitig ein schöner Performancetest, da valgrind "schön" langsam ist.

Ebenso unregelmäßig, aber auch ein schöner Test:
Ich compiliere auf meinen Raspberry Pi und lasse da mal die "10-fach"-Daten laufen.
Antworten