在QGraphicsItem上使用QRubberBand

时间:2011-04-21 18:23:50

标签: c++ qt qt4

我试图让它成为如果用户点击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()并且我必须将QRubberBand的构造函数设置为event.widget()而不是“this”因为,我认为,QGraphicsItem不会继承自QWidget的?

有更好的方法吗?

由于

1 个答案:

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