2011-04-21 12 views
1

ユーザーがQGraphicsItemをクリックすると、そのアイテムだけのQRubberBandが作成されるようにしようとしています。QGraphicsItemの上にQRubberBandを使用

私は私のクラスには、次があります。

void ImagePixmapItem::mousePressEvent(QGraphicsSceneMouseEvent *event){ 
    if(currentKey == Qt::Key_Control){ 
     qDebug("This is a control click"); 

     origin = event->screenPos(); 
     if (!selected.isNull()) 
      selected = new QRubberBand(QRubberBand::Rectangle, event->widget()); 
     selected->setGeometry(QRect(origin, QSize())); 
     selected->show(); 

    } 
} 
これは私のsetGeometry呼び出しでエラーを与えている

が、追加情報なし。これは基本的にQRubberBandから得たコードですが、event.screePos()を使用しなければならず、QGraphicsItemが継承しないため、QRubberBandのコンストラクタを「this」の代わりにevent.widget()に設定しなければなりませんでした。 QWidget?

これを行うには良い方法がありますか?私はこの例を作った

おかげ

+0

あなたが得たエラーは何ですか? –

答えて

1

は、私が

マイカスタムアイテムを助けるために願っています。

#ifndef ITEM_H 
#define ITEM_H 
#include <QtCore> 
#include <QtGui> 
class Item : public QGraphicsRectItem 
{ 
public: 
    Item() 
    { 
     setRect(0,0,100,100); 
    } 

    void mousePressEvent(QGraphicsSceneMouseEvent * event) 
    { 
     origin = event->screenPos(); 
     if (!rubberBand) 
      rubberBand = new QRubberBand(QRubberBand::Rectangle,0); 
     rubberBand->setGeometry(QRect(origin, QSize())); 
     rubberBand->show(); 
    } 

    void mouseMoveEvent(QGraphicsSceneMouseEvent * event) 
    { 
     QRectF inside = QGraphicsRectItem::boundingRect(); 
     QPointF mapPoint = mapFromScene(event->pos()); 
     if(inside.contains(mapPoint)) 
      rubberBand->setGeometry(QRect(origin, event->screenPos()).normalized()); 
    } 

    void mouseReleaseEvent(QGraphicsSceneMouseEvent * event) 
    { 
     rubberBand->hide(); 

    } 
private: 
    QRubberBand * rubberBand; 
    QPoint origin; 

}; 

#endif // ITEM_H 

とビューを表示

#include <QtGui> 
#include "item.h" 

int main(int argc, char *argv[]) 
{ 
    QApplication a(argc, argv); 
    QGraphicsView w; 
    QGraphicsScene s; 
    Item * item = new Item(); 
    w.setScene(&s); 
    s.addItem(item); 

    w.show(); 
    return a.exec(); 
}