Keine Events in abgeleiteten Klassen.

Alles rund um die Programmierung mit Qt
Antworten
slash-ex
Beiträge: 239
Registriert: 30. März 2005 21:40

Keine Events in abgeleiteten Klassen.

Beitrag von slash-ex »

Ich habe ein GraphicsView abgeleitet:

Code: Alles auswählen

class GraphWidget : public QGraphicsView
{
    Q_OBJECT

public:
	GraphWidget();
// ... usw
protected:
	void resizeEvent(QResizeEvent *event);

	void mouseMoveEvent ( QMouseEvent * event );
	void mousePressEvent ( QMouseEvent * event );
	void mouseReleaseEvent ( QMouseEvent * event );

	void drawForeground ( QPainter * painter, const QRectF & rect );
Die Events sind alle nach dem Shema implementiert:

Code: Alles auswählen

void GraphWidget::mouseReleaseEvent ( QMouseEvent * event )
{
	std::cout<<"GraphWidget - mouseReleaseEvent = "<<event->pos().x()<<"; "<<event->pos().y()<<std::endl;
	if(measureP1 == true)
		measureP2 = true;

	if(measure == false && measureP1 == true && measureP2 == true)
		distance = calcDistance(PtScMouse1, PtScMouse2);

	if(visibility == true) {
		visibility = false;
		drawVisArrow = false;
	}

	QGraphicsView::mouseReleaseEvent(event);
}
In diesem GView stelle ich ganz normal eine abgeleitete Scene dar, welche ich im Konstruktor erstelle.
und die Elemente dieser Scene sind dann abgeleitete GraphicsItems:

Code: Alles auswählen

class BFItem : public QGraphicsItem
{
public:
	BFItem(Model *mod, double *zoom_verhaeltnis);
//...

protected:
	void mousePressEvent ( QGraphicsSceneMouseEvent * event );
	void mouseReleaseEvent ( QGraphicsSceneMouseEvent * event );
	void mouseMoveEvent ( QGraphicsSceneMouseEvent * event );
};
Die Eventfunktionen sind alle so implementiert:

Code: Alles auswählen

void BFItem::mousePressEvent ( QGraphicsSceneMouseEvent * event )
{
	std::cout<<"BFItem - mousePressEvent = "<<event->pos().x()<<"; "<<event->pos().y()<<std::endl;
	mouseDown = event->scenePos();
	mouseDown /= *pixels_per_inch;

	update();
	QGraphicsItem::mousePressEvent(event);
}
in der Scene ebenfalls:

Code: Alles auswählen

void GraphicsScene::mouseMoveEvent(QGraphicsSceneMouseEvent *event) {
// 	std::cout<<"Scene - mouseMoveEvent-event"<<std::endl;

	mousePos = event->scenePos();
	update();
	QGraphicsScene::mouseMoveEvent(event);
}
Laut Qt Doku müsste ich dann doch Events bekommen, wenn ich mit der Maus über so einem Item bin. Allerdings scheint das bei diesem Beispiel nicht zu funktionieren und bei einer anderen Klasse nur bei Mausklicks. Ich verstehe nicht warum ich keine Ausgabe erhalte.
Die Events reichen nur bis zum GraphicsView und der Scene, alles was danach kommt ist irgendwie merkwürdig...
Dateianhänge
battlefield.zip
da sind die Dateien enthalten
(32.3 KiB) 320-mal heruntergeladen
slash-ex
Beiträge: 239
Registriert: 30. März 2005 21:40

Beitrag von slash-ex »

Irgendwie macht mich das Problem wahnsinnig, irgendwas Kleines habe ich wohl vergessen. Irgendwas hat sich auch beim Sprung von Qt 4.3 zu Qt 4.4 verändert, denn die Area. Klasse konnte da noch die MouseMoves abhandeln.
PeterLustig
Beiträge: 386
Registriert: 21. November 2007 20:07

Beitrag von PeterLustig »

MouseMoveEvent wird nur aktiviert wenn entweder die Maustaste gedrückt oder MouseTracking aktiviert ist.
slash-ex
Beiträge: 239
Registriert: 30. März 2005 21:40

Beitrag von slash-ex »

Ich habe mal in der area-Klasse, in der wenigstens die pressevents abgehandelt werden mit

Code: Alles auswählen

	setAcceptsHoverEvents (true);
erweitert, aber es liefert trotzdem keinen Wert. Das ganze hatte mit qt 4.3 noch funktioniert, das ist das merkwürdige.
Die andere Klasse hatte allerdings nicht funktioniert, ich vermute das könnte evtl am bounding rect liegen, obwohl alles korrekt gezeichnet wird.Trotzdem sollte das move-event beim area-Klasse zumindest in der Theorie funktionieren.
khrl01
Beiträge: 28
Registriert: 28. August 2007 13:06

Beitrag von khrl01 »

slash-ex hat geschrieben:Ich habe mal in der area-Klasse, in der wenigstens die pressevents abgehandelt werden mit

Code: Alles auswählen

	setAcceptsHoverEvents (true);
erweitert, aber es liefert trotzdem keinen Wert. Das ganze hatte mit qt 4.3 noch funktioniert, das ist das merkwürdige.
Die andere Klasse hatte allerdings nicht funktioniert, ich vermute das könnte evtl am bounding rect liegen, obwohl alles korrekt gezeichnet wird.Trotzdem sollte das move-event beim area-Klasse zumindest in der Theorie funktionieren.
Sollten die Events denn nicht virtuell sein?

Code: Alles auswählen

virtual void mouseMoveEvent ( QMouseEvent * event )
slash-ex
Beiträge: 239
Registriert: 30. März 2005 21:40

Beitrag von slash-ex »

Die Dinger sind auch virtuell. Das Sache ist nur, dass man beim Überladen der Funktion drauf verzichten kann die wieder virtuell zu deklarieren.
Nichts desto Trotz habe ichs trotzdem probiert, ALLE als virtuell zu deklarieren. Es änert sich nix. habe keine moveEvent-Ausgabe.

Ich vermute irgendwie, dass es ein Qt Bug ist, der da in die neue Version gerutscht ist. Ich meine, der Code sieht doch richtig aus oder?
Dateianhänge
battlefield.zip
habe mal etwas aufgeräumt. und die virtuals angehängt.
(32.5 KiB) 302-mal heruntergeladen
PeterLustig
Beiträge: 386
Registriert: 21. November 2007 20:07

Beitrag von PeterLustig »

Alle von einer virtuellen abgeleiteten Funktionen sind ebenfalls virtuell, ob man sie nun als solches deklariert oder nicht.

Klickst du denn auch die linke Maustaste während du die Maus darüber bewegst? Sonst bekommst du ja kein mouseMoveEvent.
slash-ex
Beiträge: 239
Registriert: 30. März 2005 21:40

Beitrag von slash-ex »

ja mache ich. (vergebens)
das event kam früher auch ohne klick!

das witzige ist, dass ich halt das event brauch um zb in der area klasse eine drehung oder eine vergrößerung durchzuführen. das sah schon ziemlich gut aus.
dann wollte ich mich um die itemklasse kümmern... :cry:
slash-ex
Beiträge: 239
Registriert: 30. März 2005 21:40

Beitrag von slash-ex »

Ich habe auch mal das eleastic nodes etwas erweitert. dort funktioniert das move-event auch nicht.
Dateianhänge
elasticnodes.zip
(15.39 KiB) 302-mal heruntergeladen
slash-ex
Beiträge: 239
Registriert: 30. März 2005 21:40

Beitrag von slash-ex »

ach ich weis auch nicht, habe einfach mal ne buganfrage geschickt. hat ja in der letzten qt version gefunzt, vielleicht bin ich auch zu blöd, aber ein grund scheints nicht zu geben.
Antworten