2012-05-14 5 views
5

私はQGraphicsRectItemのサブクラスを持っていて、マウスイベントは受け付けていません。私はマウストラッキングを有効にする必要があると言う他の質問を見たことがあるが、setMouseTrackingはQWidgetにあり、QGraphicsItemはQWidgetではないようだ。QGraphicsItemでマウスイベントを取得できますか?

私はpaintを実装しました。これは機能しています。サブクラス化されたQGraphicsViewではマウスイベントが発生しています。

ドキュメントはmousePressEvent関数(たとえば)をオーバーライドする必要があると思われるので、イベントの取得を開始する必要があります。私は私のQGraphicsViewのスーパークラスにmousePressEventを転送するかどうかは何の違いもないようです。

答えて

11

サブクラス化されたQGraphicsViewでは、オーバーライドされたマウスイベントメソッドのデフォルトの実装を呼び出す必要があります。たとえば:あなたはホバーイベントを受け入れる場合

CustomView::mousePressEvent(QMouseEvent *event) 
{ 
    // handle the event as you like 

    QGraphicsView::mousePressEvent(event); // then call default implementation 
} 

は、あなたがQGraphicsItem::setAcceptHoverEvents(true);を呼び出す必要があります。そうしないと、特定のマウストラッキングを有効にする必要はありません。

EDIT:

#include <QtGui> 

class CustomView : public QGraphicsView 
{ 
protected: 
    void mousePressEvent(QMouseEvent *event) 
    { 
     qDebug() << "Custom view clicked."; 
     QGraphicsView::mousePressEvent(event); 
    } 
}; 

class CustomItem : public QGraphicsRectItem 
{ 
protected: 
    void mousePressEvent(QGraphicsSceneMouseEvent *event) 
    { 
     qDebug() << "Custom item clicked."; 
    } 
}; 

int main(int argc, char *argv[]) 
{ 
    QApplication a(argc, argv); 

    CustomItem item; 
    item.setRect(20, 20, 60, 60); 

    QGraphicsScene scene(0, 0, 100, 100); 
    scene.addItem(&item); 

    CustomView view; 
    view.setScene(&scene); 
    view.show(); 
    return a.exec(); 
} 
+0

質問に記載されているように、私はそれを試みました。 QGraphicsItemのmousepressイベントにブレークポイントがあり、 'QGraphicsView :: mousePressEvent(event);を実行するかどうかにかかわらず呼び出されません。 – Almo

+0

@Almoサブクラス化されたQGraphicsSceneでマウスイベントをオーバーライドしていますか? – Anthony

+0

私のQGraphicsViewサブクラスでは、QGraphicsSceneを作成し、それにsetSceneを呼び出します。私はQGraphicsSceneをサブクラス化していません。 – Almo

2

は、私はあなたが遭遇したのと同じ問題を経て、私はアンソニーの本当に良い答えの上にいくつかの洞察を追加したい:ここでは、完全な実施例です。ここでは、マウスイベントとキーボードイベントを使用して実装できるいくつかの機能を示した例を示します。

イベントはQGraphicsItemGroupまたはQList<QGraphicsItem>QGraphicsItemに伝播しないことに注意してください(これはわかりやすいものです)。

#include <QtGui> 
#include <QGraphicsRectItem> 
#include <QGraphicsView> 
#include <QApplication> 
#include <QGraphicsSceneMouseEvent> 

class CustomItem : public QGraphicsEllipseItem 
{ 
protected: 
    void mousePressEvent(QGraphicsSceneMouseEvent *event) 
    { 
     if(event->button() == Qt::LeftButton) { 
      if(event->modifiers() == Qt::ShiftModifier) { 
       qDebug() << "Custom item left clicked with shift key."; 
       // add the item to the selection 
       setSelected(true); 
      } else if(event->modifiers() == Qt::AltModifier){ 
       qDebug() << "Custom item left clicked with alt key."; 
       // resize the item 
       double radius = boundingRect().width()/2.0; 
       _center = QPointF(boundingRect().topLeft().x() + pos().x() + radius, boundingRect().topLeft().y() + pos().y() + radius); 
       QPointF pos = event->scenePos(); 
       qDebug() << boundingRect() << radius << this->pos() << pos << event->pos(); 
       double dist = sqrt(pow(_center.x()-pos.x(), 2) + pow(_center.y()-pos.y(), 2)); 
       if(dist/radius > 0.8) { 
        qDebug() << dist << radius << dist/radius; 
        _isResizing = true; 
       } else { 
        _isResizing = false; 
       } 
      } else { 
       qDebug() << "Custom item left clicked."; 
       QGraphicsItem::mousePressEvent(event); 
       event->accept(); 
      } 
     } else if(event->button() == Qt::RightButton) { 
      qDebug() << "Custom item right clicked."; 
      event->ignore(); 
     } 
    } 
    void mouseMoveEvent(QGraphicsSceneMouseEvent *event) 
    { 
     if(event->modifiers() == Qt::AltModifier && _isResizing){ 
      QPointF pos = event->scenePos(); 
      double dist = sqrt(pow(_center.x()-pos.x(), 2) + pow(_center.y()-pos.y(), 2)); 
      setRect(_center.x()-this->pos().x()-dist, _center.y()-this->pos().y()-dist, dist*2, dist*2); 
     } else if(event->modifiers() != Qt::AltModifier) { 
      qDebug() << "Custom item moved."; 
      QGraphicsItem::mouseMoveEvent(event); 
      qDebug()<<"moved"<<pos(); 
     } 
    } 
    void mouseReleaseEvent(QGraphicsSceneMouseEvent *event) 
    { 
     if(event->modifiers() == Qt::AltModifier && _isResizing) { 
      _isResizing = false; 
     } else if(event->modifiers() != Qt::ShiftModifier) { 
      QGraphicsItem::mouseReleaseEvent(event); 
     } 
    } 

    int type() const 
    { 
     // Enable the use of qgraphicsitem_cast with this item. 
     return UserType+1; 
    } 
private: 
    QPointF _center; 
    bool _isResizing; 
}; 

class CustomScene : public QGraphicsScene 
{ 
protected: 
    void mousePressEvent(QGraphicsSceneMouseEvent *event) 
    { 
     qDebug() << "Custom scene clicked."; 
     QGraphicsScene::mousePressEvent(event); 
     if(!event->isAccepted()) { 
      if(event->button() == Qt::LeftButton) { 
       // add a custom item to the scene 
       QPointF pt = event->scenePos(); 
       CustomItem * item = new CustomItem(); 
       item->setRect(pt.x()-25, pt.y()-25, 50, 50); 
       item->setFlags(QGraphicsItem::ItemIsSelectable| 
           QGraphicsItem::ItemIsMovable); 
       addItem(item); 
      } else if(event->button() == Qt::RightButton) { 
       // check whether there is an item under the cursor 
       QGraphicsItem * itemToRemove = NULL; 
       foreach(auto item, items(event->scenePos())) { 
        if(item->type() == QGraphicsItem::UserType+1) { 
         itemToRemove = item; 
         break; 
        } 
       } 
       if(itemToRemove) { 
        // remove the item from the graphicsScene 
        removeItem(itemToRemove); 
       } 
      } 
     } 
    } 
    void mouseMoveEvent(QGraphicsSceneMouseEvent *event) 
    { 
     qDebug() << "Custom scene moved."; 
     QGraphicsScene::mouseMoveEvent(event); 
    } 
    void keyPressEvent(QKeyEvent * event) { 
     if(event->key() == Qt::Key_Backspace) { 
      // remove all selected items 
      qDebug() << "selected items" << selectedItems().size(); 
      while(!selectedItems().isEmpty()) { 
       removeItem(selectedItems().front()); 
      } 
     } else { 
      QGraphicsScene::keyPressEvent(event); 
     } 
    } 
}; 

int main(int argc, char *argv[]) 
{ 
    QApplication a(argc, argv); 

    CustomItem item; 
    item.setRect(20, 20, 60, 60); 
    item.setFlags(QGraphicsItem::ItemIsSelectable| 
        QGraphicsItem::ItemIsMovable); 

    CustomScene scene; 
    scene.setSceneRect(0, 0, 500, 500); 
    scene.addItem(&item); 

    QGraphicsView view; 
    view.setScene(&scene); 
    view.show(); 
    return a.exec(); 
} 

希望すると助かります。

関連する問題