QGraphicsItem在场景中的位置始终为NULL

时间:2014-10-20 09:26:51

标签: c++ qt qgraphicsitem

出于测试目的,我试图在场景上绘制几个矩形并在里面添加一些文本。矩形应该显示在一列中。它们是,但问题是文本不是。所有文本都堆叠在场景的左上角。

此外,pos()scenePos()始终为每个框和文字返回(0,0)。

以下是负责该代码的代码:

QHash<QString,Picto> Palette::getPics(){
    SpriteSheetManager ssm("sprite_zone"); 
    QList<QString> picNames = ssm.finder->allPic(); //Get all string to be displayed
    QHash<QString,Picto> picList;

    for(int i = 0; i < picNames.size(); i++){
        QString picName = picNames.at(i);
        QGraphicsTextItem *label = new QGraphicsTextItem();
        label->setPlainText(picName);
        QGraphicsRectItem *rect = new QGraphicsRectItem();
        rect->setRect(0,i*20,50,20);
        label->setParentItem(rect);
        label->setPos(0,0);
        this->addItem(rect);
        qDebug()<< rect->pos(); //always return (0,0)
    }
    return picList;
}

有谁能告诉我我做错了什么?

我已尝试过几种不同的代码,但我无法解决这个问题。

1 个答案:

答案 0 :(得分:2)

试试这个:

for(int i = 0; i < 5; i++){
    QString picName = "Sample";
    QGraphicsTextItem *label = new QGraphicsTextItem();
    label->setPlainText(picName);
    QGraphicsRectItem *rect = new QGraphicsRectItem();
    rect->setRect(0,i*50,50,20);
    label->setParentItem(rect);
    label->moveBy(0,i*50);//new
    //or label->setPos(0,i*50);
    this->addItem(rect);
    qDebug()<< rect->pos();
}

qDebug()<< rect->rect()<< label->scenePos();

的输出
QRectF(0,0 50x20) QPointF(0, 0) 
QRectF(0,50 50x20) QPointF(0, 50) 
QRectF(0,100 50x20) QPointF(0, 100) 
QRectF(0,150 50x20) QPointF(0, 150) 
QRectF(0,200 50x20) QPointF(0, 200) 

结果:

enter image description here

编辑:

setRect()上调用QGraphicsRectItem不会更改其pos(),它只会更改其绘制的矩形的位置,但项目的位置不会更改。因此,您可以将rect设置为(0, 0)并调用setPos()将项目移动到所需的位置。所以下一个代码略有不同,但场景结果完全相同。

for(int i = 0; i < 5; i++){
    QString picName = "Sample";
    QGraphicsRectItem *rect = new QGraphicsRectItem();
    QGraphicsTextItem *label = new QGraphicsTextItem();
    label->setPlainText(picName);
    rect->setRect(0,0,50,20);
    rect->setPos(0,i*50);
    //rect->moveBy(0,i*50);
    label->setParentItem(rect);
    //label->setPos(0,i*50);
    this->addItem(rect);
}

在这种情况下,pos()会返回正确的值