Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/qt/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ Qt子类图形场景不允许我选择/聚焦到其上的图形项目_C++_Qt_Qgraphicsitem_Qgraphicsscene - Fatal编程技术网

C++ Qt子类图形场景不允许我选择/聚焦到其上的图形项目

C++ Qt子类图形场景不允许我选择/聚焦到其上的图形项目,c++,qt,qgraphicsitem,qgraphicsscene,C++,Qt,Qgraphicsitem,Qgraphicsscene,我已经对我自己的qgraphicsview进行了子类化,因为我想在单击时从带有位置的场景发送信号,在这个场景中还有我的子类图形ITM,它们是可选的和可聚焦的。问题是,当我在场景中实现自己的mousepressed/mousemoved/mouseerelease事件处理程序时,我突然无法选择场景中的任何内容 以下是我对图形场景的实现: /////////////////////HEADER////////////// #include <QGraphicsScene> class

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

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

/////////////////////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/move/released实现时,它的工作方式就像charm一样。

我怀疑问题在于调用诸如qgraphicscene::mouseMoveEvent之类的事件时,这样调用可能会将事件设置为正在处理。正如QGraphicsSceneMouseEvent为国旗所述:-

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

您可以尝试在每个重载事件中调用event->setAcceptedfalse来通知要传播的事件