Seite 1 von 1
[gelöst]Bei Ändern von Type falsche Auswahl
Verfasst: 20. Oktober 2011 11:19
von toba
Hi,
Habe eine QGraphicsscene auf der geerbte Items von QGraphicsRectItem abgebildet werden.
Ändere ich den Type der Items (um später zu casten benötige ich das) stimmt die Auswahllinie nicht mehr.
Das einzigste was ich ändere ist diese Zeile im Header.
Code: Alles auswählen
enum { Type = UserType +1 }; // Type = 65536 +1
int type() const { return Type; }
Mal noch ein Bild damit klarer wird was ich eigentlich mein.
Beim Oberen ist die Linie Unten und Rechts um 1 Pixel zu weit richtung Mitte des Quadrats geschoben.

Beim Oberen habe ich die Type geändert, beim Unteren ist der Type unverändert.
Durch was geschieht soetwas/kann man es verhindern/wieder zurechtbiegen?
(Denke nicht das mehr Code was bringt, kann aber gerne noch etwas hinzufügen)
Re: Bei Ändern von Type falsche Auswahl
Verfasst: 20. Oktober 2011 11:26
von franzf
toba hat geschrieben:(Denke nicht das mehr Code was bringt, kann aber gerne noch etwas hinzufügen)
Theoretisch wahrscheinlich nicht, es ist aber nie schlecht wenn eventuelle Tester einfach was abkopieren können, was gleich kompiliert

Prinzipiell ist daher ein minimales, kompilierbares Beispiel ganz praktisch für uns, dann können wir auch nichts falsch machen. Setup wie im Original. Du musst hier auch nicht Deklaration/Implementierung splitten, da wahrscheinlich kein QObject zum moccen im Spiel ist. Einfach straight forward (d)eine main.cpp.
THX!
Re: Bei Ändern von Type falsche Auswahl
Verfasst: 20. Oktober 2011 13:50
von toba
So,
hat bissl länger gedauert, mein Projekt is schon paar zig tausend zeilen lang.
Habs mal aufs wesentliche reduziert, Projekt ist im Anhang.
(2 x in die View klicken, dann entstehen 2 Recktecke, das erste ist ohne geändertem Type, das andere hat einen geänderten Type)
Hoffe jemand hat eine Idee.
Re: Bei Ändern von Type falsche Auswahl
Verfasst: 20. Oktober 2011 14:37
von franzf
Jut, ist hier auch so. Ein Blick in die Sourcen sagt mir - das geht nicht anders :/
Code: Alles auswählen
/*!
\internal
Highlights \a item as selected.
NOTE: This function is a duplicate of qt_graphicsItem_highlightSelected() in
qgraphicssvgitem.cpp!
*/
static void qt_graphicsItem_highlightSelected(
QGraphicsItem *item, QPainter *painter, const QStyleOptionGraphicsItem *option)
{
[...]
qreal itemPenWidth;
switch (item->type()) {
case QGraphicsEllipseItem::Type:
itemPenWidth = static_cast<QGraphicsEllipseItem *>(item)->pen().widthF();
break;
case QGraphicsPathItem::Type:
itemPenWidth = static_cast<QGraphicsPathItem *>(item)->pen().widthF();
break;
case QGraphicsPolygonItem::Type:
itemPenWidth = static_cast<QGraphicsPolygonItem *>(item)->pen().widthF();
break;
case QGraphicsRectItem::Type:
itemPenWidth = static_cast<QGraphicsRectItem *>(item)->pen().widthF();
break;
case QGraphicsSimpleTextItem::Type:
itemPenWidth = static_cast<QGraphicsSimpleTextItem *>(item)->pen().widthF();
break;
case QGraphicsLineItem::Type:
itemPenWidth = static_cast<QGraphicsLineItem *>(item)->pen().widthF();
break;
default:
itemPenWidth = 1.0;
}
[...]
Es liegt an der pen-width. Der obige switch über deinen Type fängt explizit QGraphicsRectItem ab, dein spezialisierter type rutscht durch.
Kannst ja mal nen Bug-Report einreichen, denke aber nicht, dass du Erfolg haben wirst
// Nachtrag:
Freilich gibts ne Lösung:
paint() implementieren

Das QStyle::State_Selected aus option->state rausnehemen, mit den Parametern QGraphicsRectItem::paint() aufrufen, und dann nach dem Schema von qt_graphicsItem_highlightSelected (qt-src/src/gui/graphicsview/qgraphicsitem.cpp) die Selection selber malen

Re: Bei Ändern von Type falsche Auswahl
Verfasst: 20. Oktober 2011 16:21
von toba
DANKE!
Man, hätt ich aber auch selber drauf kommen können das das an der Pen width liegt.. da macht man einmal zum testen ein schwarzes Objekt und schon sieht man das nicht mehr..
dabei brauch ich ja auch den Rahmen vorerst nichtmal.
setPen(Qt::NoPen); hinzugefügt und es sieht "normal" aus..
Aber werd mir das mal merken, glaube irgendwann wird irgendjemand noch einen Rahmen haben wollen
Herzlichen Dank nochmal! (ist ja echt stark wie du dir hier mühe gibst

)
Edit:
OK, beim Ändern des Types geht später auch die collidesWithItem funktion nicht mehr, und somit jegliche collition detection..
Werde mir nun wohl selbst ein Flag einbauen damit ich die Item Typen unterscheiden kann..
Edit2:
ok, hab wohl einen Fehler gemacht, die collision detection funktioniert wunderbar..