[gelöst]QGraphicsView und QGraphicsItem

Alles rund um die Programmierung mit Qt
Antworten
MTW
Beiträge: 20
Registriert: 24. Juni 2008 18:26
Wohnort: Vaihingen/Enz
Kontaktdaten:

[gelöst]QGraphicsView und QGraphicsItem

Beitrag von MTW »

Hallo qtforum,

ich habe mich jetzt endlich an ein größeres Projekt mit Qt gewagt und dabei kommt eine QGraphicView in Vollbildgröße zum Einsatz. Leider bin ich nun an einem Punkt an dem ich nicht weiter komme und die Qt-Hilfe hilft mir irgendwie auch nicht wirklich weiter. :roll:

Ich zeige in der QGraphicsView mehrere QGraphicsItems an, die ich später wie Buttons behandeln möchte. Jetzt habe ich mir ein Signal definiert itemClicked(), dass emitet werden soll wenn ich mit der Maus auf das Item klicke. Mit scene->itemAt komme ich da nicht weiter, weil ich wissen muss welches Item angeklickt wird, nicht nur wo. Ich bin allerdings Neuling in Qt und weiß nicht wie ich es hinbekomme dass bei einem Klick auf das Item das Signal emitiert wird.

Ich habe es mal folgendermaßen probiert doch führte das nicht zum gewünschten Ergebnis:

Code: Alles auswählen

void mousePressEvent(QGraphicsSceneMouseEvent *event);

        
signals:
        void itemClicked();
dann in der cpp:

Code: Alles auswählen

void AppL::mousePressEvent(QGraphicsSceneMouseEvent *event){

    emit itemClicked();
}
doch wenn ich nun das GraphicsItem connecten will erkennt er nicht mal mein eigens definiertes Signal, vielleicht mache ich auch hierbei was falsch:

Code: Alles auswählen


 connect(testItem->toGraphicsObject(),SIGNAL(itemClicked()),qApp,SLOT(quit()));

Oder muss ich statt die Klasse von QWidget abzuleiten und dann bei der View setParent zu verwenden irgendwie gleich von QGraphicsItem ableiten.


Auf alle Fälle schon mal vielen Dank für eure Hilfe!
Zuletzt geändert von MTW am 8. Januar 2010 08:37, insgesamt 1-mal geändert.
franzf
Beiträge: 3114
Registriert: 31. Mai 2006 11:15

Beitrag von franzf »

Wahrscheinlich leitest du nicht von QObject ab.

Entweder von QGraphicsItem + QObject ableiten, oder gleich von QGraphicsObject (wenn deine Qt-Version ausreichend aktuell ist, glaub 4.6 ist nötig...)
Q_OBJECT-Macro nicht vergessen ;)
MTW
Beiträge: 20
Registriert: 24. Juni 2008 18:26
Wohnort: Vaihingen/Enz
Kontaktdaten:

Beitrag von MTW »

Danke für die schnelle Antwort!

Ich hab das Macro Q_OBJECT drin, aber ich versuch jetzt mal das ganze von QGraphicsObject abzuleiten.
MTW
Beiträge: 20
Registriert: 24. Juni 2008 18:26
Wohnort: Vaihingen/Enz
Kontaktdaten:

Beitrag von MTW »

hm :roll:

jetzt habe ich meine eigene buttonItem Klasse erstellt und sie von QGraphicsPixmapItem abgeleitet und sie sieht jetzt gerade so aus:

item.h:

Code: Alles auswählen

class buttonItem : public QObject, public QGraphicsPixmapItem
{

    Q_OBJECT
public:
    buttonItem(QPixmap pixmap, int ScreenWidth, int ScreenHeight);


    void mousePressEvent(QGraphicsSceneMouseEvent *event);

signals:
    void itemClicked();


};
und die item.ccp:

Code: Alles auswählen

#include "item.h"
#include <QtGui>

buttonItem::buttonItem(QPixmap pixmap, int ScreenWidth, int ScreenHeight){

    buttonItem::setPixmap(pixmap);
  
    connect(buttonItem::toGraphicsObject(),SIGNAL(itemClicked()),qApp,SLOT(aboutQt()));
}

void buttonItem::mousePressEvent(QGraphicsSceneMouseEvent *event){

    emit itemClicked();
}
Nun rufe ich eine Instanz davon auf und es passiert immernoch nichts wenn ich auf das Item klicke :(
MTW
Beiträge: 20
Registriert: 24. Juni 2008 18:26
Wohnort: Vaihingen/Enz
Kontaktdaten:

Beitrag von MTW »

Also ich hab jetzt nochmal geschaut und ich hab gemerkt dass das Signal emmitiert wird, aber dann muss ich wohl was an dem QObject::connect() falsch machen.

Code: Alles auswählen


#include "item.h"
#include <QtGui>

buttonItem::buttonItem(QPixmap pixmap, QGraphicsScene *scene){

    buttonItem::setPixmap(pixmap);

    QMessageBox *msgbox = new QMessageBox();
    msgbox->setText("Slot wurde ausgeführt!");



    QObject::connect(buttonItem::toGraphicsObject(),SIGNAL(itemClicked()),msgbox,SLOT(exec()));



    scenePointer = scene;

}

void buttonItem::mousePressEvent(QGraphicsSceneMouseEvent *event){

    if(event->button() == Qt::LeftButton){

        emit itemClicked();

        QMessageBox msgbox;
        msgbox.setText("itemClicked() wurde emitet!");
        msgbox.exec();
        
    }
    else {
        event->ignore();
        return;
    }

}
die messagebox bei itemClicked() wird nun emitet sobald ich das Item angeklickt habe, jedoch danach irgendwie auch wenn ich irgendwo in die GraphicsScene klicke, wenn ich dann irgendwo rechts klicke, dann gehts wieder nur auf dem Item.

Die andere messageBox, die erscheinen soll wenn itemClicked() emitet wurde kommt nie.

Habt ihr keine Idee??
MTW
Beiträge: 20
Registriert: 24. Juni 2008 18:26
Wohnort: Vaihingen/Enz
Kontaktdaten:

Beitrag von MTW »

Ok, hab gestern den Fehler gefunden, funktioniert jetzt einwandfrei, trotzdem danke!
Antworten