[gelöst]Bei Ändern von Type falsche Auswahl

Alles rund um die Programmierung mit Qt
Antworten
toba
Beiträge: 28
Registriert: 22. September 2011 09:28

[gelöst]Bei Ändern von Type falsche Auswahl

Beitrag 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.
Bild
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)
Zuletzt geändert von toba am 4. November 2011 10:57, insgesamt 1-mal geändert.
franzf
Beiträge: 3114
Registriert: 31. Mai 2006 11:15

Re: Bei Ändern von Type falsche Auswahl

Beitrag 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!
toba
Beiträge: 28
Registriert: 22. September 2011 09:28

Re: Bei Ändern von Type falsche Auswahl

Beitrag 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.
Dateianhänge
Testprojekt.7z
Komplettes Projekt
(3.08 KiB) 118-mal heruntergeladen
franzf
Beiträge: 3114
Registriert: 31. Mai 2006 11:15

Re: Bei Ändern von Type falsche Auswahl

Beitrag 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 :)
toba
Beiträge: 28
Registriert: 22. September 2011 09:28

Re: Bei Ändern von Type falsche Auswahl

Beitrag 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.. :cry:
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 :D

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..
Antworten