Qt子类化的图形场景不允许我选择/聚焦到它上面的图形项目

Qt subclassed graphics scene does not allow me select/focus to graphics item on it

本文关键字:图形 聚焦 项目 允许我 子类 Qt 不允许 选择      更新时间:2023-10-16

我已经将我自己的qgraphicsview子类化了,因为我想在点击时从带有位置的场景发送信号,在这个场景中还有我的子类图形itms,它们是可选择和可聚焦的。问题是,当我在场景中实现自己的mousepressed/mousemoved/mousereleased事件处理程序时,我突然无法选择场景中的任何内容。

以下是我对图形场景的实现:

/////////////////////HEADER//////////////
#include <QGraphicsScene>
class myGraphicsScene : public QGraphicsScene
{
    Q_OBJECT
public:
   explicit myGraphicsScene(QObject * parent = 0);
   explicit myGraphicsScene(qreal x, qreal y, qreal width, qreal height, QObject * parent = 0);
signals:
   void mouseReleased(QPointF pos);
   void mousePressed(QPointF pos);
   void mouseMoved(QPointF pos);
   void mouseDoubleClicked(QPointF pos);
protected:
   void mouseDoubleClickEvent (QGraphicsSceneMouseEvent * event);
   void mousePressEvent(QGraphicsSceneMouseEvent * event);
   void mouseMoveEvent(QGraphicsSceneMouseEvent * event);
   void mouseReleaseEvent(QGraphicsSceneMouseEvent * event);

 ////////////////////CPP//////////////////////
 #include <QGraphicsSceneMouseEvent>

 myGraphicsScene::myGraphicsScene(QObject *parent) : QGraphicsScene(parent)
 {
 }
 myGraphicsScene::myGraphicsScene(qreal x, qreal y, qreal width, qreal height, QObject *parent)
    : QGraphicsScene( x, y, width, height, parent )
 {
 }
 void myGraphicsScene::mouseDoubleClickEvent ( QGraphicsSceneMouseEvent *event )
 {
     QGraphicsScene::mouseDoubleClickEvent ( event );
     emit mouseDoubleClicked ( event->scenePos () );
 }
 void myGraphicsScene::mousePressEvent (QGraphicsSceneMouseEvent *event)
 {
    QGraphicsScene::mousePressEvent ( event );
    emit mousePressed ( event->scenePos () );
 }
 void myGraphicsScene::mouseMoveEvent (QGraphicsSceneMouseEvent *event)
 {
    QGraphicsScene::mouseMoveEvent ( event );
    emit mouseMoved ( event->scenePos () );
 }
 void myGraphicsScene::mouseReleaseEvent (QGraphicsSceneMouseEvent *event)
 {
    QGraphicsScene::mousePressEvent ( event );
    emit mouseReleased ( event->scenePos () );
 }

哪个事件实现是错误的

附言:当我评论掉mousePressed/moved/released的实现时,它就像魅力一样。

我怀疑问题在于调用QGraphicsScene::mouseMoveEvent这样的事件时,可能会将事件设置为正在处理。正如QGraphicsSceneMouseEvent为接受的标志所述:-

设置accept参数表示事件接收器想要该事件。不需要的事件可能会传播到父窗口小部件默认情况下,isAccepted()设置为true,但不要依赖于此,因为子类可能会选择在其构造函数中清除它

您可以尝试在每个重载事件中调用event->setAccepted(false),以发出要传播的事件的信号。