2012-10-20 4 views
0

Qgraphicsscene을 클래스로 구현 한 다음 QGraphicsRectItem을 추가하기 위해 QGraphicsScene :: mousePressEvent를 사용합니다.이 항목에는 QGraphicsRectItem :: mousePressEvent에 대한 구현이 포함되어 있습니다. 문제는 해당 이벤트입니다. rect 항목에서 장면으로 전파되며 클릭하면 새로운 rect 항목이 추가되지만이 항목의 내부 이벤트는 장면에 전파되지 않으므로 이벤트 -> 수락을 시도하지만 이벤트가 전파됩니다. 어떻게 그럴 수있어? 어떤 도움을 주셔서 감사합니다.QGraphicsItem에서 QGraphicsScene으로 이벤트 전달 중단 QT

QWidgets에
#include "imageview.h" 

ImageView::ImageView(QWidget *parent){ 
    scene = new ImageScene(this); 
    setScene(scene); 
    //this->setMouseTracking(true); 
    this->setInteractive(true); 
} 


ImageScene::ImageScene(QWidget *parent){ 
    current = NULL; 
    selection = new QRubberBand(QRubberBand::Rectangle,parent); 
    selection->setGeometry(QRect(10,10,20,20)); 
    setSceneRect(0,0,500,500); 
} 

void ImageScene::mousePressEvent(QGraphicsSceneMouseEvent *event){ 
    QGraphicsScene::mousePressEvent(event); 
    /*IGNORING THIS EVENT FROM QGRAPHICSRECTITEM*/ 
    cout<<"image view"<<endl; 
    if(this->selectedItems().length() == 0){ /*WORKS BUT IN SOME IMPLEMENTATION IS A PROBLEM (WHEN I DELETE THE ITEM WITH A DELETE BUTTON THE EVENT IS FIRED AND ADD A NEW ITEM .)*/ 
     origin = event->scenePos(); 
     selection->show(); 
    } 
} 
void ImageScene::mouseReleaseEvent(QGraphicsSceneMouseEvent *event){ 
    if(selection->isVisible() && selection->rect().width() >= 20 && selection->rect().height() >= 20){ 
     QGraphicsScene::mouseReleaseEvent(event); 

     ResizableRect * rselection = new ResizableRect(); 
      //selection->origin = event->scenePos(); 
      //selection->grabMouse(); 
     cout<<"add"<<endl; 
     this->addItem(rselection); 
     rselection->setPos(selection->pos()); 
     rselection->setRect(0,0,selection->rect().width(),selection->rect().height()); 
    } 
    selection->hide(); 

} 
void ImageScene::mouseMoveEvent(QGraphicsSceneMouseEvent *event){ 
    QGraphicsScene::mouseMoveEvent(event); 
    if(selection->isVisible()){ 
     QPoint rorigin(origin.x(),origin.y()); 
     int xdes = event->scenePos().x(); 
     int ydes = event->scenePos().y(); 
     xdes = xdes > 0? xdes:0; 
     ydes = ydes > 0? ydes:0; 
     xdes = xdes < this->width()?xdes:this->width(); 
     ydes = ydes < this->height()?ydes:this->height(); 

     QPoint rdest(xdes,ydes); 
     selection->setGeometry(QRect(rorigin,rdest).normalized()); 
    } 

} 
+2

코드에서 event-> accept() 호출은 어디에 있습니까? – jmk

+0

ResizableRect 클래스의 mousePressEvent 함수에서이 클래스는 QGraphicsRectItem을 확장합니다. –

+1

[여기] (http://qt-project.org/doc/qt-4.8/QGraphicsScene.html#event-handling-and-propagation) 및 [여기] (http://qt-project.org/doc)를 참조하십시오. /qt-4.8/qgraphicsitem.html#events). 희망이 도움이됩니다. – sashoalm

답변

0

반대, QGraphicsScene는 하위 항목 전에 이벤트를 잡는다 :

여기 내 qgraphicsscene 코드입니다. Qt 문서에 설명되어 있습니다.

제대로 작동하려면 QGraphcisScene 대신 QGraphicsView를 다시 구현하십시오. 거기에 mousePressEvent를 다시 구현하십시오.

그 순간 마우스 포인터 아래의 항목을 결정할 수 있습니다. 거기에 있습니다 - 그냥 QGraphicsView :: mousePressEvent(); 그렇지 않습니다 - 구현을 사용하여 새 항목을 추가하십시오.

또한 다른보기의 동작을 구분할 수 있습니다.