2014-10-20 90 views
1

出于测试目的,我试图在场景上绘制几个矩形并在其中添加一些文本。矩形应该显示在一列中。他们是,但问题是文本不是。所有文本都堆叠在场景的左上角。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; 
} 

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

我试过这个代码有几个变化,但我不能解决这个问题。

回答

2

试试这个:

输出的 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) 

结果

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

enter image description here

编辑:

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); 
} 

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

+0

这意味着你必须移动标签本身,不是吗?我强硬它应该与它的父母一起移动,因为它的位置应该是相对于父母的。 – Laetan 2014-10-20 11:50:04

+0

@Laetan是的,我移动标签。是的,它相对于父母,但正如你所说,你的父母每次都有0,0个坐标,所以标签的坐标也是0,0。 – Chernobyl 2014-10-20 12:04:38

+0

我知道,但这就是问题所在。为什么直角坐标显然不位于视图上的0,0位置时总会有(0,0),并且我如何设置它以便正确的位置用于儿童物品? – Laetan 2014-10-20 12:24:55