• 6555阅读
  • 9回复

[提问]自定义QGraphicsItem [复制链接]

上一主题 下一主题
离线bqlf1907
 

只看楼主 倒序阅读 楼主  发表于: 2011-08-06
class MapSpriteItem : public QGraphicsItem {
MapSpriteItem(MapSprite* sprite,QString imageName);
QString getMapSpriteName() {    
     return mapSpriteName;
}
private:
    QString mapSpriteName;
}

MapSpriteItem::MapSpriteItem(MapSprite* sprite,const QString imageName)
{  
    mapSpriteName = sprite->mapSpriteName;
}

MapSpriteItem *item = new MapSpriteItem(mapSprite,spriteData_->imagePath_);
mapSpriteScene_->addItem(item);


当我取出时
MapSpriteItem *item = (MapSpriteItem *)this->scene()->itemAt(convertPoint);
这个item 中 mapSpriteName 竟然为空。偶尔会是空的,不是每次都是,有没有知道为什么????

离线wxj120bw

只看该作者 1楼 发表于: 2011-08-07
回 楼主(bqlf1907) 的帖子
跟踪下你的程序 打印this->scene()位置还有convertPoint,看convertPoint是不是每次都再this->scene()这里面
离线bqlf1907

只看该作者 2楼 发表于: 2011-08-07
Re:回 楼主(bqlf1907) 的帖子
引用第1楼wxj120bw于2011-08-07 11:47发表的 回 楼主(bqlf1907) 的帖子 :
跟踪下你的程序 打印this->scene()位置还有convertPoint,看convertPoint是不是每次都再this->scene()这里面


    MapSpriteItem *item = (MapSpriteItem *)this->scene()->itemAt(convertPoint);
    if(item) {
        choosedMapSpriteItem = item;
        mapWindow_->setCurMapSpriteItem(item->getMapSpriteName());
    }
    update();
代码原本是这样的,每次取的item,都会赋给choosedMapSpriteItem,然后在painterEvent中画出
choosedMapSpriteItem的框
    if(choosedMapSpriteItem) {
        QRectF rectF = choosedMapSpriteItem->mapRectToScene(choosedMapSpriteItem->boundingRect());
        QPolygon converPolygon = mapFromScene(rectF);
        painter.setPen(Qt::red);
        painter.drawRect(converPolygon.boundingRect());
        }
    画的框都是我选中的item,都是正常的。说明item取的是对的。用断点查看item值,mapSpriteName值为0x0。。。。。
离线wxj120bw

只看该作者 3楼 发表于: 2011-08-07
回 2楼(bqlf1907) 的帖子
如果item取的是对,打印其地址。
离线bqlf1907

只看该作者 4楼 发表于: 2011-08-09
MapSpriteItem *item = new MapSpriteItem(mapSprite,spriteData_->imagePath_);
qDebug()<<item; ----- 1
mapSpriteScene_->addItem(item);

MapSpriteItem *item = (MapSpriteItem *)this->scene()->itemAt(convertPoint);
qDebug()<<item; ------ 2

控制台
1------ QGraphicsItem (this = 0x1011b99b0 , parent = 0x0 , pos = QPointF(550, 181) , z = 0 , flags =  ( ItemIsMovable ) )
2------ QGraphicsItem (this = 0x1011d3940 , parent = 0x1011b99b0 , pos = QPointF(0, 0) , z = 0 , flags =  ( ) )
离线bqlf1907

只看该作者 5楼 发表于: 2011-08-09
回 3楼(wxj120bw) 的帖子
MapSpriteItem *item = new MapSpriteItem(mapSprite,spriteData_->imagePath_);
qDebug()<<item; ----- 1
mapSpriteScene_->addItem(item);

MapSpriteItem *item = (MapSpriteItem *)this->scene()->itemAt(convertPoint);
qDebug()<<item; ------ 2

控制台
1------ QGraphicsItem (this = 0x1011b99b0 , parent = 0x0 , pos = QPointF(550, 181) , z = 0 , flags =  ( ItemIsMovable ) )
2------ QGraphicsItem (this = 0x1011d3940 , parent = 0x1011b99b0 , pos = QPointF(0, 0) , z = 0 , flags =  ( ) )
离线wxj120bw

只看该作者 6楼 发表于: 2011-08-09
回 5楼(bqlf1907) 的帖子
两个QGraphicsItem 的指针不一样 (0x1011b99b0 ,0x1011d3940 )
离线bqlf1907

只看该作者 7楼 发表于: 2011-08-10
添加的跟取出的不一样.......那不是不能用scene,要自己定义个list保存数据........不会吧。。。。
离线bqlf1907

只看该作者 8楼 发表于: 2011-08-10
item里有个setData()专门用来存入自定义属性数据的,但是....存入的值...取出后为什么还是空的....真干!!!
离线bqlf1907

只看该作者 9楼 发表于: 2011-08-10
终于取到值了。。。。。原来是因为加了itemground的缘故。
快速回复
限100 字节
 
上一个 下一个