Dado que el objeto
Cruceta no es un QWidget no tiene "presencia" en el formulario, luego no puede recibir eventos directamente. Digamos que lo que sucede es que tu "pintas" el objeto de forma explícita, de tal forma que el contenedor no sabe que en esas coordenadas hay un objeto al que deba pasarle eventos.
Tienes varias soluciones:
Usar señales
Puedes crear una señal en el objeto escena que exponga el evento que te interesa, en este caso mouseMove. Entonces simplemente haces un connect para cada objeto que deba conocer ese evento y listo:
Código C++:
Ver originalclass Cruceta
: public QObject // necesario para los eventos.
// Se puede sustituir por cualquier objeto que herede de QObject
{
Q_OBJECT // necesario para los eventos
public slot:
void MouseMove(QGraphicsSceneMouseEvent *event)
{ }
};
class Scene // Por qué cruceta en español y scene en inglés???
{
signals:
// Recuerda que las señales no tienen implementación, de eso se encarga qt.
void OnMouseMove(QGraphicsSceneMouseEvent *event);
};
void Scene::Scene(...)
{
// O como se llame tu objeto, tampoco es necesario que se cree aquí
cruceta = new Cruceta(...);
// Eso sí, esto hay que hacerlo después de crear tu objeto cruceta
connect(this, SIGNAL(OnMouseMove(QGraphicsSceneMouseEvent*)),
cruceta, SLOT(MouseMove(QGraphicsSceneMouseEvent*)));
}
void Scene::mouseMoveEvent(QGraphicsSceneMouseEvent *event)
{
emit OnMouseMove(event); // Emitimos la señal
// ------------------
// (Aqui sigue actuando el evento)
}
Usar el patrón observer
Esta solución es similar a la anterior pero basada en C++ puro.
Necesitas una clase base para los suscriptores de los eventos. Lo ideal es que sea una clase virtual pura para reducir acoplamientos:
Código C++:
Ver originalclass Subscriber
{
public:
void MouseMove(QGraphicsSceneMouseEvent* event) = 0;
};
El siguiente paso es hacer que tu objeto
Cruceta herede de esta nueva clase. Como
Subscriber es virtual pura no te debería ocasionar muchos problemas si tienes que recurrir a la herencia múltiple:
Código C++:
Ver originalclass Cruceta
: public Subscriber, /* Tus propias herencias */
{
public:
void MouseMove(QGraphicsSceneMouseEvent* event ) override
{ }
};
Y para terminar metemos mano al objeto
Scene. Una forma de resolver esta papeleta consiste en tener una lista de suscriptores, así se puede propagar el evento con un simple bucle:
Código C++:
Ver originalclass Scene
{
std::vector<Subscriber*> _subscribers;
public:
Scene()
{
_cruceta = new Cruceta;
Attach(_cruceta);
}
void Attach(Subscriber* newSubscriber)
{ _subscribers.push_back(newSubscriber); }
void MouseMove(QGraphicsSceneMouseEvent* event)
{
// la segunda línea es una lambda, no te asustes :)
std::for_each(_subscribers.begin(),_subscribers.end(),
[event](Subscriber* ptr) { ptr->MouseMove(event); });
}
};
Cualquiera de estos dos mecanismos te permite separar ambas capas de código. La única diferencia es que la primera solución aprovecha las capacidades de Qt mientras que en la segunda lo tienes que cocinar todo a mano :)
Un saludo