QGraphicsScene und mouse-Event Propagierung
Verfasst: 6. Oktober 2010 11:00
Hallo zusammen,
ich beschäftige mich erst seit ein paar Wochen mit Qt - Wenn mein folgendes Problem trivial ist oder auf meiner Blödheit beruht, möge man es mir verzeihen...
Ich habe leider nichts dazu gefunden und die Doku konnte mir da auch nicht helfen.
Mein Programm hat folgende Struktur:
Ich habe eine eher verwaltende Klasse abgeleitet von QWidget, die wiederum eine QGraphicsScene und eine QGraphicsView zur Darstellung und für Benutzereingaben hat. Das Maus-Event-Handling möchte ich aber eigentlich in meiner Verwaltungsklasse beherbergen.
Mein Problem ist jedoch, dass mousePressEvents zwar wunderbar von der View bis zur Verwaltungsklasse durchgereicht werden, mouseRelease und Doppelklick jedoch in der Scene "verschwinden", auch wenn sich in der Scene keine Items befinden.
Ist das so gewollt (wenn ja, was wird damit gemacht?), habe ich irgendwelche Flags vergessen, oder hab ich sonst irgendwas übersehen? Ich wollte das Eventhandling ungern in die Scene oder View auslagern, zumal mich interessiert, warum das ganze nicht so funktioniert, wie ich mir das gedacht hatte...
Kompilierbares Beispiel um zu verdeutlichen, was ich meine:
mainwindow.h
mainwindow.cpp
myscene.h
myscene.cpp
myview.h
myview.cpp
und eine passende main:
Das ganze erzeugt bei einem Mausklick mit release folgende Ausgabe:
Vielen Dank schonmal...
ich beschäftige mich erst seit ein paar Wochen mit Qt - Wenn mein folgendes Problem trivial ist oder auf meiner Blödheit beruht, möge man es mir verzeihen...
Mein Programm hat folgende Struktur:
Ich habe eine eher verwaltende Klasse abgeleitet von QWidget, die wiederum eine QGraphicsScene und eine QGraphicsView zur Darstellung und für Benutzereingaben hat. Das Maus-Event-Handling möchte ich aber eigentlich in meiner Verwaltungsklasse beherbergen.
Mein Problem ist jedoch, dass mousePressEvents zwar wunderbar von der View bis zur Verwaltungsklasse durchgereicht werden, mouseRelease und Doppelklick jedoch in der Scene "verschwinden", auch wenn sich in der Scene keine Items befinden.
Ist das so gewollt (wenn ja, was wird damit gemacht?), habe ich irgendwelche Flags vergessen, oder hab ich sonst irgendwas übersehen? Ich wollte das Eventhandling ungern in die Scene oder View auslagern, zumal mich interessiert, warum das ganze nicht so funktioniert, wie ich mir das gedacht hatte...
Kompilierbares Beispiel um zu verdeutlichen, was ich meine:
mainwindow.h
Code: Alles auswählen
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QtGui/QMainWindow>
#include <qDebug>
#include "myview.h"
#include "myscene.h"
#include <QDockWidget>
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
MainWindow(QWidget *parent = 0);
~MainWindow();
MyView* myView;
MyScene* myScene;
protected:
void mousePressEvent(QMouseEvent *);
void mouseReleaseEvent(QMouseEvent *);
};
#endif // MAINWINDOW_HCode: Alles auswählen
#include "mainwindow.h"
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
{
myView = new MyView();
myScene = new MyScene();
myView->setScene(myScene);
myScene->setSceneRect(-50,-50,100,100);
QDockWidget *dockWidget = new QDockWidget(tr("Dock Widget"), this);
dockWidget->setAllowedAreas(Qt::LeftDockWidgetArea |
Qt::RightDockWidgetArea);
dockWidget->setWidget(myView);
addDockWidget(Qt::LeftDockWidgetArea, dockWidget);
}
MainWindow::~MainWindow()
{
}
void MainWindow::mousePressEvent(QMouseEvent *event)
{
qDebug() << "MainWindow: mousePressEvent";
}
void MainWindow::mouseReleaseEvent(QMouseEvent *event)
{
qDebug() << "MainWindow: mouseReleaseEvent";
}
Code: Alles auswählen
#ifndef MYSCENE_H
#define MYSCENE_H
#include <QGraphicsScene>
#include <qDebug>
class MyScene : public QGraphicsScene
{
Q_OBJECT
public:
explicit MyScene(QObject *parent = 0);
protected:
void mousePressEvent(QGraphicsSceneMouseEvent *event);
void mouseReleaseEvent(QGraphicsSceneMouseEvent *event);
};
#endif // MYSCENE_H
Code: Alles auswählen
#include "myscene.h"
MyScene::MyScene(QObject *parent) :
QGraphicsScene(parent)
{
}
void MyScene::mousePressEvent(QGraphicsSceneMouseEvent *event)
{
qDebug() << "MyScene: mousePressEvent";
QGraphicsScene::mousePressEvent(event);
}
void MyScene::mouseReleaseEvent(QGraphicsSceneMouseEvent *event)
{
qDebug() << "MyScene: mouseReleaseEvent";
QGraphicsScene::mouseReleaseEvent(event);
}
Code: Alles auswählen
#ifndef MYVIEW_H
#define MYVIEW_H
#include <QGraphicsView>
#include <qDebug>
class MyView : public QGraphicsView
{
Q_OBJECT
public:
explicit MyView(QWidget *parent = 0);
protected:
void mousePressEvent(QMouseEvent *);
void mouseReleaseEvent(QMouseEvent *);
};
#endif // MYVIEW_H
Code: Alles auswählen
#include "myview.h"
MyView::MyView(QWidget *parent) :
QGraphicsView(parent)
{
}
void MyView::mousePressEvent(QMouseEvent *event)
{
qDebug() << "MyView: mousePressEvent";
QGraphicsView::mousePressEvent(event);
}
void MyView::mouseReleaseEvent(QMouseEvent *event)
{
qDebug() << "MyView: mouseReleaseEvent";
QGraphicsView::mouseReleaseEvent(event);
}
Code: Alles auswählen
#include <QtGui/QApplication>
#include "mainwindow.h"
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
MainWindow w;
w.show();
return a.exec();
}
Code: Alles auswählen
MyView: mousePressEvent
MyScene: mousePressEvent
MainWindow: mousePressEvent
MyView: mouseReleaseEvent
MyScene: mouseReleaseEventVielen Dank schonmal...