【问题标题】:Qt Scaling Custom QGraphicsItem with unscaled textQt Scaling Custom QGraphicsItem with unscaled text
【发布时间】:2016-03-11 14:02:24
【问题描述】:

我正在尝试创建 customObject(矩形,它继承自 QGraphicsItem),它将在场景上绘制带有特定文本(存储在属性中),但是当我缩放它时 - 我希望保持相同大小的文本。这是我的结束。绘画功能:

    void CustomRectangle::paint(QPainter *painter, const QStyleOptionGraphicsItem *options, QWidget *widget)
    {
        QColor currentColor = get_ColorByCurrentState();

        QRectF rect = boundingRect();
        QPen pen(currentColor, Own_LineWidith);

        painter->setPen(pen);
        painter->drawRect(rect);

        QRectF rect_text(rect.x(), rect.y(),100,100);
        painter->drawText(rect_text,this->getText() );
    }

还有我的两个缩放函数:

    void CustomObject::scaleUp()
    {
        scale(ScaleFactor_X,ScaleFactor_Y);
    }

    void CustomObject::scaleDown()
    {
        scale(1/ScaleFactor_X,1/ScaleFactor_Y);
    }

但文本仍然会随着矩形缩放。

编辑 1 我尝试以另一种方式添加它,即创建矩形并将其添加到场景中(此处 - 名为“newObject”),但结果仍然相同。

    QGraphicsTextItem* GTI = new QGraphicsTextItem(newObject->toStringForScene(), newObject);

我开始认为我应该将每个文本对象创建为单独的对象并将其保存为不同的列表。当然,每当它移动对象时,我都必须更新它。

【问题讨论】:

    标签: c++ qt text qgraphicsitem


    【解决方案1】:

    试试这个:

    QGraphicsTextItem* gti = new QgraphicsTextItem("text");
    gti->setFont(QFont("Arial", 18));
    
    // this is important
    gti->setFlag(QGraphicsTextItem::ItemIgnoresTransformations, true);
    
    scene->addItem(gti);
    

    QGraphicsItem::ItemIgnoresTransformations 标志可防止在缩放视图时缩放图形项 (QGraphicsView)。

    这意味着您需要一个单独的项目来呈现文本。但它可以是矩形项目的 子项目。

    【讨论】:

    • 效果不如我预期。它忽略了正确向上/向下缩放其父对象,但也忽略了缩小/缩小。
    • 是的,它忽略放大/缩小。我以为这就是你想要的。抱歉,我没有正确理解您的问题。
    【解决方案2】:

    我用 QGraphicsTextItem 的指针作为类的属性解决了这个问题。

    QGraphicsTextItem* GTI;
    

    我在构造函数中初始化它:

    GTI_Description = new  QGraphicsTextItem(this->toStringForScene());
    

    然后我调用函数来更新它的 X 和 Y:

    void updateTextPosition()
    {
        GTI->setX( this->x() );
        GTI->setY( this->y() );
    }
    

    并将其添加到场景中:

    addTextToScene(DragScene* _scene)
    {
        updateDescriptionPosition();
        _scene->addItem(GTI_GTI);
        _scene->update();
    }
    

    然后,当我更改位置时(在 mouseRelease 事件的处理程序中),我只需调用 updateTextPosition()。

    【讨论】:

      猜你喜欢
      • 2015-05-04
      • 2013-11-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-12-01
      • 2021-04-07
      • 1970-01-01
      相关资源
      最近更新 更多