【问题标题】:QGraphicsTextItem doesn't change positionQGraphicsTextItem 不改变位置
【发布时间】:2021-08-30 10:08:24
【问题描述】:

我尝试在定义的位置添加带有文本的QGraphicsTextItem,但文本始终位于 QGraphicsWidget 的左上角。这是简单的代码:

QGraphicsTextItem* textItem= new QGraphicsTextItem(QString::number(i));
            textItem->setFont(QFont("Helvetica", 12));
            textItem->setTextWidth(50);
            textItem->setDefaultTextColor(QColor(255, 255, 255));
            textItem->setPos(QPoint(300,300)));

然后我读到QGraphicsTextItem 有自己的boundingBox 并且边界框可能在(0,0)leftTop 角。这就是我尝试更改边界框坐标的原因:

textItem->boundingRect().setWidth(50);
            textItem->boundingRect().setHeight(50);
            textItem->boundingRect().setTopLeft(QPoint(100,100));

但是当我在这些更改之后打印boundingBox size 和 topLeft 坐标时,总是相同的:

textItem->boundingRect();
                std::cout << textItem.topLeft().x() << std::endl;
                std::cout << textItem.topLeft().y() << std::endl;
                std::cout << textItem.height() << std::endl;
                std::cout << textItem.width() << std::endl;

结果:

0
0
32
50

您对如何将文本移动到设定位置有什么建议吗?

【问题讨论】:

  • 我不明白,你想用鼠标改变它的位置吗?或者你想把它设置在某个位置
  • 在某一点。但即使我添加 setPos(Qpoint(300,300)),它也总是在 (0,0) 中。

标签: c++ qt


【解决方案1】:

QGraphicsView 正在渲染您的QGraphicsScene。一个场景可以有一个几何体,独立于QGraphicsView的几何体

来自QGraphicsScene::sceneRect 文档:

此属性保存场景矩形;的边界矩形 场景

场景矩形定义场景的范围。它主要是 QGraphicsView 用来确定视图的默认可滚动区域, 并通过 QGraphicsScene 来管理项目索引。

如果未设置,或者设置为空 QRectF,sceneRect() 将返回 自场景创建以来场景中所有项目的最大边界矩形 创建的(即,在添加或移动项目时增长的矩形 在场景中,但从不缩小)。

因此,如果您不想滚动,您只需将 x、y 的 sceneRect 设置为 (0,0),宽度和高度与渲染场景的 QGraphicsView 相同。

在您的代码中,我认为您没有为您的场景设置sceneRect,您的场景的大小将与其唯一的子项相同。

【讨论】:

  • 我尝试通过使用 item->sceneBoundingRect().setRect(newX, newY, width, height) 来更改项目 sceneBoundingRect 但它似乎不起作用(场景边界框的参数是还是一样)。我不知道为什么,但是sceneBoundingBox在左上角设置了textItem的位置(在300,300中)和textItem的大小,但是textItem->boundingBox()的左上角在(0,0),我不能改变它(通过 setRect)
  • 你应该调用 setSceneRect。您现在的做法是获取 QRect 的副本并设置与您的场景无关的边界。
【解决方案2】:

来自QGraphicsView文档:

QGraphicsView 可用于可视化整个场景,或仅显示部分场景 它。默认情况下会自动检测可视化区域 第一次显示视图(通过调用 QGraphicsScene::itemsBoundingRect())。设置可视化区域 自己矩形,你可以调用 setSceneRect()。

 auto scene = new QGraphicsScene(this);
    scene->setSceneRect(0,0,width(),height());
    ui->graphicsView->setScene(scene);
    QGraphicsTextItem* textItem= new QGraphicsTextItem(QString::number(1234));
                textItem->setFont(QFont("Helvetica", 12));
                textItem->setTextWidth(50);
                textItem->setDefaultTextColor(QColor(0, 0, 0));
                textItem->setPos(QPoint(100,300));

      scene->addItem(textItem);

我在主窗口 UI 中添加一个 QGraphicsView 项,然后在主窗口的构造函数中创建一个场景,然后像这样 setSceneRect 很重要scene-&gt;setSceneRect(0,0,width(),height());

【讨论】:

    猜你喜欢
    • 2015-12-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-30
    • 1970-01-01
    相关资源
    最近更新 更多