qt4.3.3: problem mit den mouseevents bei qgraphicsitem



  • ich habe ein problem mit den mouse-events und zwar bekomme ich in diesem beispiel keine ausgabe der position. wenn ich also ein item verschieben will passiert nichts ):

    class Scene : public QGraphicsScene
    {
    private:
    
    public:
    	Scene(QSizeF rect = QSizeF(72 * 8, 48 * 8)) {
    		setSceneRect(0, 0, rect.width(), rect.height() );
    
    		this->setBackgroundBrush(Qt::darkGreen);
    	}
    };
    
    class Board : public QGraphicsView
    {
    Q_OBJECT
    private:
    	QList<Model*> models;
    
    	QSizeF table_size;
    	double pixels_per_inch;
    
    	Scene *scene;
    
    	QPointF mousePos, mouseDown, mouseUp;
    	bool mousePressed;
    
    public:
    	Board();
    
    	//zur liste hinzufügen
    	void addModel(Model*);
    	void addUnit(Unit* u);
    // 	//aufs spielfeld platzieren...
    	void placeUnit(Unit*, const QPointF &);
    
    	QPointF *mPos() {return &mousePos;};
    
    protected:
    	void drawForeground ( QPainter * painter, const QRectF & rect );
    
    	//Fenster
    	void resizeEvent(QResizeEvent *event);
    // 
    // 	//Maus
    	void mouseMoveEvent(QMouseEvent *event);
    // 
    	void mousePressEvent(QMouseEvent *event);
    	void mouseReleaseEvent(QMouseEvent *event);
    	void mouseDoubleClickEvent(QMouseEvent *event);
    //	void wheelEvent(QWheelEvent *event);
    // 
    // 	//Keyboard
    	void keyPressEvent(QKeyEvent *event);
    	void keyReleaseEvent(QKeyEvent *event);
    
    	//Drag and Drop
    // 	void dragEnterEvent(QDragEnterEvent *event);
    // 	void dragMoveEvent(QDragMoveEvent *event);
    // 	void dragLeaveEvent(QDragLeaveEvent *event);
    // 	void dropEvent(QDropEvent *event);
    };
    
    Board::Board() {
    
    	setInteractive(true);
    // 	setDragMode(QGraphicsView::RubberBandDrag);
    
    	scene = new Scene;
    	setScene(scene);
    
    	mousePressed = false;
    
    	int width = 72.0;
    	int height = 48.0;
    	setMinimumWidth(width * 8);
    	setMinimumHeight(height * 8);
    	table_size = QSizeF(width, height);
    	pixels_per_inch = 1;
    
    	//TEST
    	Unit *unit = new Unit("Boyz", "Nahkämpfer", 265, 6);
    	AbstractInfantry *ai = new AbstractInfantry(2);
    	ai->setOwner(unit);
    	Infantry *model1 = new Infantry(ai);
    	model1->set_position(10, 10);
    	model1->sSelect(false);
    	model1->sMove(false);
    	model1->sTurn(false);
    	model1->setOwner(unit);
    // 	addModel(model1);
    ...
    	addUnit(unit);
    } 
    
    void Board::addUnit(Unit* u)
    {
    	double *ppi = &pixels_per_inch;
    
    	for(int i = 0; i <= u->size(); i++) {
    		BFItem *model = new BFItem(u->modelAt(i), ppi, scene);
    		models.append(u->modelAt(i) );
    
    		scene->addItem(model);
    	}
    }
    
    void Board::mouseMoveEvent(QMouseEvent *event) {
    	mousePos = event->pos();
    
    	// wenn man ein rechteck ziehen will...
    	if(mousePressed)
    		scene->update();
    
    	QGraphicsView::mouseMoveEvent(event);
    }
    
    void Board::mousePressEvent(QMouseEvent *event) {
    	mouseDown = event->pos();
    	mousePressed = true;
    
    	double mx = mouseDown.x()/pixels_per_inch;
    	double my = mouseDown.y()/pixels_per_inch;
    
    	for (int i = 0; i < models.size() && models.size() >= 1; i++) {
    		double x = models.at(i)->position().x();
    		double y = models.at(i)->position().y();
    		double radius = models.at(i)->size()/2;
    
    		double dist = sqrt ( pow(mx-x,2.0) + pow(my-y,2.0) );
    		if (dist < radius) {
    			models.at(i)->sSelect(true);
    			scene->update();
    		}
    		else {
    			models.at(i)->sSelect(false);
    			scene->update();
    		}
    	}
    
    	QGraphicsView::mousePressEvent(event);
    }
    
    void Board::mouseReleaseEvent(QMouseEvent *event) {
    	mouseUp = event->pos();
    	mousePressed = false;
    
    	if (event->pos() == mouseDown)
    		return;
    
    	for(int i = 0; i < models.size() && models.size() >= 1; i++) {
    			models.at(i)->sMove(false);
    			models.at(i)->sTurn(false);
    	}
    	// was im rahmen ist markieren
    	QRectF rahmen(event->pos()/pixels_per_inch, mouseDown/pixels_per_inch);
    	for(int i = 0; i < models.size() && models.size() >= 1; i++) {
    		if (rahmen.contains(models.at(i)->position() ) )
    			models.at(i)->sSelect(true);
    	}
    
    	scene->update();
    	QGraphicsView::mouseReleaseEvent(event);
    }
    
    void Board::mouseDoubleClickEvent(QMouseEvent *event) {
    	if (event->button() != Qt::LeftButton)
    		return;
    
    	double mx = event->x()/pixels_per_inch;
    	double my = event->y()/pixels_per_inch;
    
    	for (int i = 0; i < models.size(); i++) {
    		double dist = sqrt ( pow(mx-models.at(i)->position().x(),2.0) + pow(my-models.at(i)->position().y(),2.0) );
    		if (dist < 0.5) {
    			Unit *owner = models.at(i)->owner();
    			for (int j = 0; j < models.size(); j++)
    				if (models.at(j)->owner() == owner)
    					models.at(j)->sSelect(true);
    		}
    	}
    	scene->update();
    	QGraphicsView::mouseDoubleClickEvent(event);
    }
    
    class BFItem : public QGraphicsItem
    {
    private:
    	Model *dModel;
    
    	bool selected;
    	bool moving;
    	bool turning;
    
    	QPointF mousePos, mouseDown, mouseUp;
    	double *pixels_per_inch;
    
    public:
    	BFItem(Model *mod, double *zoom_verhaeltnis, QGraphicsScene* scene = 0);
    
    	QRectF boundingRect() const;
    
    	void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget);
    
    	void drawModel(QPainter &painter, QPen &pen, QPointF pos);
    	void drawSelCircles(QPainter &painter, QPainter &px_painter, QPen &pen);
    	void drawUnitNames(QPainter &px_painter);
    	void drawRangeCircles(QPainter &painter, QPainter &px_painter, QPen &pen);
    	float drawAngelGrid(QPainter &painter, QPainter &px_painter);
    
    // protected:
    	void mousePressEvent ( QGraphicsSceneMouseEvent * event );
    	void mouseReleaseEvent ( QGraphicsSceneMouseEvent * event );
    	void mouseMoveEvent ( QGraphicsSceneMouseEvent * event );
    };
    
    BFItem::BFItem(Model *mod, double *zoom_verhaeltnis, QGraphicsScene* scene) : QGraphicsItem(0, scene) {
    	dModel = mod;
    
    	selected = false;
    	moving = false;
    	turning = false;
    
    	pixels_per_inch = zoom_verhaeltnis;
    }
    
    QRectF BFItem::boundingRect() const {
    	double x = dModel->position().x();
    	double y = dModel->position().y();
    
    	if(dModel->type() == MT_VEHICLE) {
    		float width = dModel->height();
    		float height = dModel->height();
    		QRectF curRect(QRectF(x - width/2, y - height/2, width, height) );
    		return curRect;
    	}
    	else {
    		double durchmesser = dModel->size();
    		double radius = dModel->size()/2;
    
    		QRectF curRect(QRectF(x - radius, y - radius, durchmesser, durchmesser) );
    		return curRect;
    	}
    }
    void BFItem::paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget) {
    	Q_UNUSED(widget);
    
    	// Painter mit Zoll-Koordinatensystem
    	painter->setRenderHint(QPainter::Antialiasing);
    	painter->setRenderHint(QPainter::SmoothPixmapTransform);
    	//! Painter automatisch so skalieren, dass man mit den "Zoll"werten malt.
    	painter->scale(*pixels_per_inch, *pixels_per_inch);
    	// Painter mit standard Pixel-Koordinatensystem
    	QPainter *px_painter = new QPainter; 
    // 	px_painter->setRenderHint(QPainter::Antialiasing);
    // 	px_painter->setRenderHint(QPainter::SmoothPixmapTransform);	
    
    	QPen pen;
    
    	selected = dModel->selected();
    	moving = dModel->moving();
    	turning = dModel->turning();
    
    	/*!
    		Modelle zeichnen
    	*/
    	drawRangeCircles(*painter, *px_painter, pen);
    	/*!
    		Eiheiten zeichnen
    	*/
    	drawModel(*painter, pen, dModel->position() );
    	/*!
    		Modelle selektieren
    	*/
    	drawSelCircles(*painter, *px_painter, pen);
    	/*!
    		Reichweite anzeigen
    	*/
    	drawRangeCircles(*painter, *px_painter, pen);
    	/*!
    		Modelle drehen
    	*/
    	drawAngelGrid(*painter, *px_painter);
    
    	/*!
    		Bewegungsimplementation...
    	*/
    	if(moving) {
    		QPointF vector = dModel->position() - mousePos/(*pixels_per_inch);
    		double dist = sqrt ( pow(vector.x(), 2.0) + pow(vector.y(), 2.0) );
    
    		if(dist <= dModel->owner()->movement() ) {
    			drawModel(*painter, pen, mousePos/(*pixels_per_inch) );
    			painter->drawLine(dModel->position(), mousePos/(*pixels_per_inch));
    		}
    	}
    }
    
    //PROTECTED
    void BFItem::mousePressEvent ( QGraphicsSceneMouseEvent * event )
    {
    	std::cout<<"mousePressEvent = "<<std::endl;
    	mouseDown = event->scenePos();
    	update();
    	QGraphicsItem::mousePressEvent(event);
    }
    
    void BFItem::mouseReleaseEvent ( QGraphicsSceneMouseEvent * event )
    {
    	std::cout<<"mouseReleaseEvent = "<<std::endl;
    	mouseUp = event->scenePos();
    	update();
    	QGraphicsItem::mouseReleaseEvent(event);
    }
    
    void BFItem::mouseMoveEvent ( QGraphicsSceneMouseEvent * event )
    {
    	std::cout<<"mouseMoveEvent = "<<event->pos().x()<<"; "<<event->pos().y()<<std::endl;
    	mousePos = event->scenePos();
    	if(moving)
    		update();
    	QGraphicsItem::mouseMoveEvent(event);
    }
    




  • das problem ist kurioser, denn im graphicsview bekomme ich eine ausgabe, wenn ich die events überlade. in der grpahics-scene bekomme ich auch eine ausgabe wenn ich die events überlade, aber in der graphicsitem klasse rein gar nichts!!!
    ich habe alles probiert, merkwürdig ist aber das es in dem elastic nodes example klappt.



  • das problem ist kurioser, denn im graphicsview bekomme ich eine ausgabe, wenn ich die events überlade. in der grpahics-scene bekomme ich auch eine ausgabe wenn ich die events überlade, aber in der graphicsitem klasse rein gar nichts!!!
    ich habe alles probiert, merkwürdig ist aber das es in dem elastic nodes example klappt.


Anmelden zum Antworten