【问题标题】:Position of a QGraphicsItem in scene always NULLQGraphicsItem 在场景中的位置始终为 NULL
【发布时间】:2016-04-27 04:53:10
【问题描述】:

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

此外,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;
}

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

我已经尝试了这个代码有几个变体,但我无法解决这个问题。

【问题讨论】:

    标签: c++ qt qgraphicsitem


    【解决方案1】:

    试试这个:

    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()&lt;&lt; rect-&gt;rect()&lt;&lt; label-&gt;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) 
    

    结果:

    编辑:

    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() 返回正确的值

    【讨论】:

    • 这意味着您必须移动标签本身,不是吗?我很难它应该与它的父级一起移动,因为它的位置应该是相对于父级的。
    • @Laetan 是的,我移动标签。是的,它相对于父级,但正如你所说,你的父级每次都有 0,0 坐标,所以标签的坐标也是 0,0。
    • 我知道,但这就是问题所在。当矩形显然不在视图上的 0,0 位置时,为什么它们总是具有 (0,0),我该如何制作以便将正确的位置用于子项?
    • @Laetan 我添加了详细说明。请查看我的编辑。
    • 太棒了!我虽然构造函数正在执行 setPos。非常感谢!
    猜你喜欢
    • 2014-09-20
    • 2023-03-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-26
    • 1970-01-01
    • 1970-01-01
    • 2020-03-24
    相关资源
    最近更新 更多