2011-05-23 73 views
1

我在扩展QGraphicsItem以将其添加到扩展QGraphicsSene。当我以正常的方式将扩展项目添加到场景并将场景添加到图形视图时,它会显示图像,但是当我按如下方式添加图像时,它不会显示。有人可以检查一下并告诉我这个问题。扩展QGraphicsScene

#ifndef IMAGEMAP_H 
#define IMAGEMAP_H 

#include <QGraphicsItem> 
#include <QGraphicsScene> 

class ScanImage : public QGraphicsItem 
{ 
public: 
    ScanImage(const QString imgsrc); 
    ~ScanImage(); 

    void setImageSource(const QString is); 
    QString imageSource(); 

    QRectF boundingRect() const; 
    void paint(QPainter *painter, 
       const QStyleOptionGraphicsItem *option, 
       QWidget *widget); 

protected: 
    void mousePressEvent(QGraphicsSceneMouseEvent *mouseEvent); 

private: 
    QString imgsrc; 
}; 

class ImageHolder : public QGraphicsScene 
{ 
public: 
    ImageHolder(); 
    ~ImageHolder(); 

protected: 
    void mousePressEvent(QGraphicsSceneMouseEvent *mouseEvent); 
    void mouseReleaseEvent(QGraphicsSceneMouseEvent *mouseEvent); 

private: 
    QRectF selectedRect; 
}; 

#endif // 

#include "imagemap.h" 
#include "QtGui" 

ScanImage::ScanImage(const QString is) 
{ 
    imgsrc=is; 
    update(); 
} 

ScanImage::~ScanImage() 
{ 
} 

ImageHolder::ImageHolder() 
{ 
    setSceneRect(0.0,0.0,512.0,512.0); 
    ScanImage im("2.jpg"); 
    im.setZValue(1.0); 
    im.setVisible(true); 
    addItem(&im); 
} 

ImageHolder::~ImageHolder() 
{ 
} 

void ScanImage::mousePressEvent(QGraphicsSceneMouseEvent *event) 
{ 
    qDebug() <<event->pos(); 
} 

void ImageHolder::mousePressEvent(QGraphicsSceneMouseEvent *event) 
{ 
    qDebug() <<event->scenePos().rx(); 
    selectedRect.setTopLeft(event->scenePos()); 
} 

void ImageHolder::mouseReleaseEvent(QGraphicsSceneMouseEvent *mouseEvent) 
{ 
    qDebug() <<mouseEvent->scenePos().ry(); 
    selectedRect.setBottomRight(mouseEvent->scenePos()); 
    addRect (selectedRect); 
} 

QRectF ScanImage::boundingRect() const 
{ 
    return QRectF(0.0, 0.0, 512.0, 512.0); 
} 

void ScanImage::paint(QPainter* painter, 
         const QStyleOptionGraphicsItem*, 
         QWidget*) 
{ 
    QRectF target(0.0, 0.0, 512.0, 512.0); 
    QRectF source(0.0, 0.0, 512.0, 512.0); 
    painter->drawImage(target, QImage(imgsrc),source); 
} 

void ScanImage::setImageSource(QString is) 
{ 
    imgsrc = is; 
} 

QString ScanImage::imageSource() 
{ 
    return imgsrc; 
} 

主要

int main(int argv, char* argc[]) 
{ 
    QApplication app(argv,argc); 
    ImageHolder scene; 
    QGraphicsView view(&scene); 
    view.resize(512,512); 
    view.show(); 
    return app.exec(); 
} 

回答

2

你加入分配为QGraphicsScene构造函数的栈上的局部变量QGraphicsItem。构造函数完成后,堆栈中的对象会自动解除分配(即删除),并在您的情况下从场景中移除。使用new运算符创建项目。