hi,
ich habe eine QGraphicsScene, die mousePressEvent(..), mouseReleaseEvent(..) und mouseMoveEvent(...) implementiert.
In der QGraphicsScene befinden sich andere QWidgets, bei denen die mouse events allerdings nicht mehr richtig ankommen(bei wildem klicken tut sich manchmal was)
wie kann ich die mouse events, nachdem ich sie in der graphics scene verarbeitet habe, an die widgets in der szene weiterleiten?
event->accept() und event->ignore() bewirken nichts.
vielen dank im vorraus
frank
Mouse events weiterleiten?
ich habe inzwischen auch versucht mit QCoreApplication::sendEvent(..) die events weiterzuleiten, hat aber nur unerwünschte effekte herbeigeführt.
hier mal zur verdeutlichung ein vereinfachtes beispiel.
problem: button läst sich nicht anklicken.
hier mal zur verdeutlichung ein vereinfachtes beispiel.
problem: button läst sich nicht anklicken.
Code: Alles auswählen
#include <QApplication>
#include <QMainWindow>
#include <QGraphicsScene>
#include <QGraphicsView>
#include <QPushButton>
class GraphicsScene : public QGraphicsScene {
public:
void mouseMoveEvent(QGraphicsSceneMouseEvent *mouseEvent) {}
void mouseDoubleClickEvent(QGraphicsSceneMouseEvent *mouseEvent) {}
void mousePressEvent(QGraphicsSceneMouseEvent *mouseEvent) {}
void mouseReleaseEvent(QGraphicsSceneMouseEvent *mouseEvent) {}
};
class MainWindow : public QMainWindow {
public:
MainWindow() : QMainWindow() {
QGraphicsScene *scene = new GraphicsScene();
QGraphicsView *view = new QGraphicsView(scene);
setCentralWidget(view);
scene->addWidget(new QPushButton("hallo"));
}
};
int main(int argc, char **argv) {
QApplication app(argc, argv);
MainWindow *mw = new MainWindow();
mw->show();
return app.exec();
}
Code: Alles auswählen
void mouseMoveEvent(QGraphicsSceneMouseEvent *mouseEvent) {
QGraphicsScene::mouseMoveEvent(mouseEvent);
}selbes für mousePressEvent, mouseReleaseEvent usw. und der Button lässt sich normal bedienen.
Das Problem ist einfach dass du mit dem erhaltenen mouseEvent gar nichts machst, es also einfach "frisst". Die scene leitet nichts automatisch weiter, wenn du die Methoden implementierst aber nichts entsprechendes selber machst.
Mich hätte auch noch interessiert wie du das mit dem sendEvent() versucht hast
cool danke, funktioniert.
mit sendEvent sahs etwa so aus:
bei mir kann man die Widgets per drag&drop bewegen, und sendEvent hat dann dazu geführt dass die Widgest zwar am Zielort angekommen sind, aber unterwegs unkontrollierte Bewegungen gemacht haben. button klicken ging trotzdem nicht.
gruß
Frank
mit sendEvent sahs etwa so aus:
Code: Alles auswählen
void GraphicsScene::mousePressEvent(QGraphicsSceneMouseEvent *mouseEvent) {
// .... stuff
for all qwidgets in the scene {
QApplication::sendEvent(widget, &mouseEvent);
}
}
gruß
Frank
Code: Alles auswählen
void GraphicsScene::mousePressEvent(QGraphicsSceneMouseEvent *mouseEvent) {
// .... stuff
for all qwidgets in the scene {
QApplication::sendEvent(widget, &mouseEvent);
}
}
1) &mouseEvent ist hier vollkommen falsch! Du hast das direkt so aus der Doku übernommen, nehm ich an. mouseEVent ist schon ein pointer, sendEvent will nen pointer, und nicht die Adresse von dem
2) for all qwidgets in scene, naja... Du willst doch nicht allen Widgets das event senden, sondern nur dem welches gerade unter der Maus liegt.
Dazu nimmst du dir die pos() des events, suchst dir das entsprechende item in der scene mit QGraphicsScene::itemAt(), rechnest die Koordinaten von scenePos in itemPos um. Jetzt musst du natürlich noch in ein QEvent umbasteln, welches von einem QWidget verstanden wird. Ein QGraphicsSceneMouseEvent wird dein QWidget strikt ablehnen, es wird nichts ausführen!
Ich habs jetzt ums hier zu posten nur zusammenkopiert, den alten Code hatte ich nichtmehr.franzf hat geschrieben:Code: Alles auswählen
void GraphicsScene::mousePressEvent(QGraphicsSceneMouseEvent *mouseEvent) { // .... stuff for all qwidgets in the scene { QApplication::sendEvent(widget, &mouseEvent); } }
1) &mouseEvent ist hier vollkommen falsch! Du hast das direkt so aus der Doku übernommen, nehm ich an. mouseEVent ist schon ein pointer, sendEvent will nen pointer, und nicht die Adresse von demDass das überhaupt kompiliert hat wundert mich, wenn es kompiliert hat ist das Verhalten undefiniert.
itemAt liefert mit aber ein QGraphicsItem, das müsste ich erst noch das dazugehörige QWidget bestimmen...2) for all qwidgets in scene, naja... Du willst doch nicht allen Widgets das event senden, sondern nur dem welches gerade unter der Maus liegt.
Dazu nimmst du dir die pos() des events, suchst dir das entsprechende item in der scene mit QGraphicsScene::itemAt(), rechnest die Koordinaten von scenePos in itemPos um.
Hatte es auf die Schnelle so gemacht zum Testen, hast schon recht.
stimmt, dumm von mir;)Jetzt musst du natürlich noch in ein QEvent umbasteln, welches von einem QWidget verstanden wird. Ein QGraphicsSceneMouseEvent wird dein QWidget strikt ablehnen, es wird nichts ausführen!