C++ QGraphicsItem在场景中的位置始终为空

C++ QGraphicsItem在场景中的位置始终为空,c++,qt,qgraphicsitem,C++,Qt,Qgraphicsitem,出于测试目的,我尝试在场景上绘制几个矩形,并在其中添加一些文本。矩形应该显示在一列中。是的,但问题是文本不是。所有文本都堆叠在场景的左上角 此外,pos()和scenePos()始终为每个框和文本返回(0,0) 以下是负责此操作的代码: QHash<QString,Picto> Palette::getPics(){ SpriteSheetManager ssm("sprite_zone"); QList<QString> picNames = ssm.

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

此外,
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;
}
QHash调色板::getPics(){
SpriteSheetManager ssm(“sprite_区”);
QList picNames=ssm.finder->allPic();//获取要显示的所有字符串
QHash列表;
对于(int i=0;i设置明文(picName);
QGraphicsRectItem*rect=新的QGraphicsRectItem();
rect->setRect(0,i*20,50,20);
标签->设置父项(rect);
标签->设置位置(0,0);
此->附加项(rect);
qDebug()pos();//始终返回(0,0)
}
返回picList;
}
谁能告诉我我做错了什么

我尝试了几种不同的代码,但我无法解决此问题。

尝试以下方法:

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();
}
结果:

编辑:

QGraphicsRectItem
上调用
setRect()
不会更改其
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);
}
for(int i=0;i<5;i++){
QString picName=“样本”;
QGraphicsRectItem*rect=新的QGraphicsRectItem();
QGraphicsTextItem*标签=新的QGraphicsTextItem();
标签->设置明文(picName);
rect->setRect(0,0,50,20);
rect->setPos(0,i*50);
//rect->moveBy(0,i*50);
标签->设置父项(rect);
//标签->设置位置(0,i*50);
此->附加项(rect);
}

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

,这意味着您必须移动标签本身,不是吗?我认为它应该和它的父对象一起移动,因为它的位置应该是相对于父对象的。@Laetan是的,我移动标签。是的,它是相对于父对象的,但正如你所说,你的父对象每次都有0,0个坐标,所以标签的坐标也是0,0。我知道,但这就是问题所在。当rect显然不位于视图上的0,0位置时,为什么它总是有(0,0),我如何使其正确的位置用于儿童项目?@Laetan I补充了详细说明。请看我的编辑。太好了!我以为构造器在做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);
}