PDA

View Full Version : overriding mousemoveevent SEGFAULTS



amartinis
7th September 2017, 22:38
Hello, this is my very first post.

I have moved from other languages to PyQt several years ago and now wish to reimplement several systems on Qt with C++.

I have stumbled upon a SEGFAULT that I could trace here:

void QScene::mouseMoveEvent(QGraphicsSceneMouseEvent *event){
QGraphicsScene:mouseMoveEvent(event);
}

I am in the process of subclassing a QGraphicsScene. Relevant Code below:

HEADER

#ifndef QSCENE_H
#define QSCENE_H
#include "itemspanel.h"
#include "QGraphicsScene"
#include "QtCore/Qt"
#include "QColor"


class QScene : public QGraphicsScene
{
Q_OBJECT


public:
explicit QScene(QGraphicsScene* parent = 0);
~QScene();
ItemsPanel *panel;
int miModo;
int modoGoma;
int modoLinea;
int modoFluo;
int modoLineaH;
int modoRect;
QPointF inicio;
QPointF fin;
int x = 0;
int y = 0;
QColor brushColor;
QColor penColor;
int penWidth;
int pen1;
int pen2;
int pen3;
int pen4;
void fmodoGoma();
void fmodoRect();
void fmodoLinea();
void fmodoLineaH();
void fmodoFluo();
void fmodoPen1();
void fmodoPen2();
void fmodoPen3();
void fmodoPen4();
void fmodoColorRojo();
void fmodoColorAzul();
void fmodoColorVerde();
void fmodoColorNaranja();
void fmodoColorAmarillo();
void fmodoColorNegro();
void guardar();
void eliminarItemsSeleccionados();
void levantarCapaTexto(QString);
virtual void mouseDoubleClickEvent(QGraphicsSceneMouseEvent *event);
virtual void mousePressEvent(QGraphicsSceneMouseEvent *event);
virtual void mouseMoveEvent(QGraphicsSceneMouseEvent *event);
virtual void mouseReleaseEvent(QGraphicsSceneMouseEvent *event);

};

#endif // QSCENE_H

CODE

#include "qscene.h"
#include "QGraphicsScene"
#include "itemspanel.h"
#include "QPointF"
#include "QtCore/Qt"
#include "QColor"
#include "QGraphicsTextItem"
#include "QGraphicsSceneMouseEvent"
#include "QGraphicsRectItem"
#include "QGraphicsLineItem"
#include "QPen"
#include "QBrush"

QScene::QScene(QGraphicsScene *parent):
QGraphicsScene(parent)
{
ItemsPanel *panel = 0;
}

QScene::~QScene()
{
delete panel;
}

void QScene::mouseDoubleClickEvent(QGraphicsSceneMouseE vent *event){
QGraphicsTextItem *txtItem = new QGraphicsTextItem("...");
txtItem->setPos(event->scenePos());
txtItem->setTextInteractionFlags(Qt::TextSelectableByMouse | Qt::TextSelectableByKeyboard | Qt::TextEditable);
txtItem->setFlag(QGraphicsItem::ItemIsMovable);
txtItem->setFlag(QGraphicsItem::ItemIsSelectable);
txtItem->setFlag(QGraphicsItem::ItemSendsGeometryChanges);
txtItem->setFont(QFont("Lucida Console",19));
this->addItem(txtItem);
txtItem->setFocus();
QGraphicsScene::mouseDoubleClickEvent(event);
}

void QScene::mousePressEvent(QGraphicsSceneMouseEvent *event){
this->x = event->scenePos().x();
this->y = event->scenePos().y();
QGraphicsScene::mousePressEvent(event);
}
void QScene::mouseMoveEvent(QGraphicsSceneMouseEvent *event){
QGraphicsScene:mouseMoveEvent(event);
}

void QScene::mouseReleaseEvent(QGraphicsSceneMouseEvent *event){
if(miModo==modoRect){
QGraphicsRectItem *rect = new QGraphicsRectItem(x,y,event->scenePos().x()-x,event->scenePos().y()-y);
QPen pen ;
pen.setColor(penColor);
pen.setWidth(penWidth);
rect->setPen(pen);
rect->setFlag(QGraphicsItem::ItemIsMovable);
rect->setFlag(QGraphicsItem::ItemIsSelectable);
rect->setFlag(QGraphicsItem::ItemSendsGeometryChanges);
this->addItem(rect);
miModo = 0 ;
guardar();
QGraphicsScene:mouseReleaseEvent(event);
}


The mouse move event gets called hundreds of times and finally a segmentation fault occurs. I do not have idea as to why. Can someone provide some clues?

Regards!

d_stranz
8th September 2017, 00:24
The mouse move event gets called hundreds of times and finally a segmentation fault occurs. I do not have idea as to why. Can someone provide some clues?

Possibly you have stack overflow due to recursion. I do not think you should call the base class method if you override an event handler. Instead, you should call event->accept() if you process the event yourself or event->ignore() if you are not interestd and want the event processed by the base class in the normal way.

Please use CODE tags next time you post source code. Se my signature block below for instructions.

Santosh Reddy
8th September 2017, 05:48
Please pay close attention to compiler warning, you will see the problem. Anyway the problem is that you have indefinite recursion.



void QScene::mouseMoveEvent(QGraphicsSceneMouseEvent *event){
//QGraphicsScene:mouseMoveEvent(event); //<<<<<<<<< replace with below line, note the "::"
QGraphicsScene::mouseMoveEvent(event);
}

void QScene::mouseReleaseEvent(QGraphicsSceneMouseEvent *event){
...
//QGraphicsScene:mouseReleaseEvent(event); //<<<<<<<<< replace with below line, note the "::"
QGraphicsScene::mouseReleaseEvent(event);
...
}