0

Qgraphicsscene をクラスとして実装し、次に QGraphicsScene::mousePressEvent を使用して QGraphicsRectItem を追加します。このアイテムには QGraphicsRectItem::mousePressEvent の実装もあります。問題は、rect アイテムのイベントがシーンに伝播され、クリックすると、新しい rect アイテムが追加されますが、このアイテム内のイベントがシーンに伝播されないようにしたいのですが、イベント -> 受け入れを試みましたが、イベントが伝播されました。助けてくれてありがとう。

ここに私のqgraphicssceneコードがあります:

#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());
    }

}
4

1 に答える 1

1

QWidgets とは反対に、QGraphicsScene は子アイテムの前にイベントをキャッチします。Qtのドキュメントに記載されています。

それを正しく処理するには、QGraphcisScene の代わりに QGraphicsView の再実装を使用してください。そこに mousePressEvent を再実装します。

その時点で、マウス ポインターの下の項目を決定できます。そこにあります - QGraphicsView::mousePressEvent(); を呼び出すだけです。そうではありません - 新しいアイテムを追加するために実装を使用してください。

また、異なるビューの動作を分離することもできます。

于 2013-03-07T14:05:24.583 に答える