Qt 使用未缩放的文本缩放自定义 QGraphicsItem
Qt Scaling Custom QGraphicsItem with unscaled text
我正在尝试创建将使用 ceratin 文本(存储在属性中)绘制在场景上的自定义对象(矩形,它继承自 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);
我开始认为我应该将每个文本对象创建为分离对象并将其保存在不同的列表中。当然,每当它的对象移动时,我就必须更新它。
试试这个:
QGraphicsTextItem* gti = new QgraphicsTextItem("text");
gti->setFont(QFont("Arial", 18));
// this is important
gti->setFlag(QGraphicsTextItem::ItemIgnoresTransformations, true);
scene->addItem(gti);
QGraphicsItem::ItemIgnoresTransformations
标志可防止在缩放视图时缩放图形项目 (QGraphicsView)。
这意味着您需要一个单独的项目来呈现文本。但它可以是矩形项的 子项。
我用 QGraphicsTextItem 的指针作为 class 的属性解决了这个问题。
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()。
我正在尝试创建将使用 ceratin 文本(存储在属性中)绘制在场景上的自定义对象(矩形,它继承自 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);
我开始认为我应该将每个文本对象创建为分离对象并将其保存在不同的列表中。当然,每当它的对象移动时,我就必须更新它。
试试这个:
QGraphicsTextItem* gti = new QgraphicsTextItem("text");
gti->setFont(QFont("Arial", 18));
// this is important
gti->setFlag(QGraphicsTextItem::ItemIgnoresTransformations, true);
scene->addItem(gti);
QGraphicsItem::ItemIgnoresTransformations
标志可防止在缩放视图时缩放图形项目 (QGraphicsView)。
这意味着您需要一个单独的项目来呈现文本。但它可以是矩形项的 子项。
我用 QGraphicsTextItem 的指针作为 class 的属性解决了这个问题。
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()。