Seite 1 von 1

QGraphicsScene und eigene QGraphicsItem-Klassen

Verfasst: 8. Dezember 2009 22:05
von theheader
Um meiner Applikation ein bisschen Farbe einzuhauchen, habe ich 2 QGraphicsItem-Klassen erstellt. Die beiden Klassen sind eine Art Button, dass heisst ich möchte den QMouseEvent neu implementieren.

Um die Objekte nun benutzen zu können, habe ich ne QGraphicsScene erstellt und dazu eine QGraphicsView. Die Elemente habe ich dazugefügt, allerdings wird ein Element bsp. nur halb dargestellt (hab mit den Koordinaten herumgespielt, bringe nie das ganze Element in die Scene) und der MouseEvent funktioniert nicht.

Code: Alles auswählen

notifyButton::notifyButton(QSize nsize, mainwindow *main) :
	size(nsize),
	mainW(main)
{
    eventText = "You have a new invitation to an event!";
    buddyText = "You have a new buddyrequest!";
    popup = new QFrame(mainW, Qt::Popup | Qt::Window);
    popup->resize(100, 100);
    mainLayout = new QVBoxLayout(popup);
    mainLayout->setAlignment(Qt::AlignTop);

    eventLabel = new QLabel(popup);
    eventLabel->setText(eventText);
    buddyLabel = new QLabel(popup);
    buddyLabel->setText(buddyText);

    popup->hide();

}

void notifyButton::mousePressEvent(QGraphicsSceneMouseEvent *event)
{
    popup->show();
    qDebug() << "Test";
}

void notifyButton::paint(QPainter *painter, const QStyleOptionGraphicsItem *option,
	       QWidget *widget)
{
    painter->setPen(QPen(Qt::black, 1, Qt::SolidLine));
    painter->setBrush(QBrush(activeColor, Qt::SolidPattern));
    painter->drawRect(0, 0, size.width(), size.height());
}
Die Stelle mit der QGrahicsScene:

Code: Alles auswählen

scene = new QGraphicsScene(0, 0, 400, 400);
    scene->addItem(messageButton);
    view = new QGraphicsView(scene);
    layout0->addWidget(view);
An was kann das liegen? Es gibt keine andere Möglichkeit, diese Elemente ohne QGraphicsScene zu implementieren, damit auch die MouseEvents funktionieren, oder?

Verfasst: 8. Dezember 2009 22:19
von franzf
Wichtig hier wäre auch noch dein boundingRect().
Für Testzwecke ist es auch immer ratsam, das boundingRect() im paint() zu zeichnen.
Ohne korrektem boundingRect kommen deine Mouse-Events an völlig unerwarteten Stellen an.

Verfasst: 8. Dezember 2009 22:35
von theheader
Danke für die schnelle Antwort. Okay, ich dachte, das boundingRect() müsse man in diesem Falle nicht implementieren, da es ein einfaches Rechteck ist. Scheint, als ob ich die boundingRect() nicht ganz begriffen hatte.

Ich hab mal was geschrieben, weiss aber nicht, ob das stimmt, da ich in meinem Buch kein passendes Beispiel finde.

Code: Alles auswählen

QRectF notifyButton::boundingRect(void) const
{
    return QRectF(-1, -1, size.width()+2, size.height()+2);
}
Es wird jetzt das ganze Objekt angezeigt, aber der MouseEvent geht noch nicht. Stimmt die Funktion?

thx

Verfasst: 8. Dezember 2009 22:44
von franzf
Kannst du dein Projekt mal in ein ZIP packen und hier anhängen?
Einen Fehler sehen kann ich in dem geposteten Code nicht. (Ist aber auch schon spät :P)

Ist dein WindowManager vllt. so "intelligent", dass er den Fokus noch auf deinem MainWindow hält und deshalb dein popup irgendwo im Hintergrund öffnet? Das popup ist nämlich ein QFrame und kein QDialog, der sich immer in den Vordergrund schiebt, sobald mit exec() ausgeführt. Kommt die qDebug()-Meldung in der Konsole an? Unter Windows muss man glaub ich erst noch die .pro anpassen, dass man den Output auch sieht.

Aber am einfachsten das ganze Projekt anhängen, thx :)

Verfasst: 10. Dezember 2009 18:54
von theheader
Danke für dein Angebot, aber ich hab inzwischen eine Lösung gefunden. Manchmal sieht man vor lauter Bäume den Wald nicht mehr.

Ich hab das QGraphicsRectItem als Subklasse von QPushButton gemacht und einen paintEvent implementiert, so dass ich die Klasse als Widget behandeln kann.

Irgendwie hatte ich mich zu fest auf QGraphics versteift und die einfachste Lösung übersehen.

gruss
theheader