出于测试目的,我试图在场景上绘制几个矩形并在里面添加一些文本。矩形应该显示在一列中。它们是,但问题是文本不是。所有文本都堆叠在场景的左上角。
此外,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;
}
有谁能告诉我我做错了什么?
我已尝试过几种不同的代码,但我无法解决这个问题。
答案 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)
结果:
编辑:
在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()
会返回正确的值