在 QGraphicsWidget::paint 函数中绘制文本
Posted
技术标签:
【中文标题】在 QGraphicsWidget::paint 函数中绘制文本【英文标题】:Drawing Text In a QGraphicsWidget::paint function 【发布时间】:2018-04-12 19:52:25 【问题描述】:我正在尝试在 qgraphicswidget 中绘制文本。场景的水平比例为 -180 到 180,垂直比例为 -90 到 +90(这是一张世界地图)。
当我放大地图上的单个项目时,我希望显示一些文本。我的一个特定项目的绘制功能的代码如下所示:
void AirportGraphicsWidget::paint(QPainter* painter, const QStyleOptionGraphicsItem* option, QWidget* widget)
QPen pen;
pen.setStyle(Qt::PenStyle::NoPen);
painter->setBrush(Qt::lightGray);
painter->setPen(pen);
if (m_curr_lod <= LevelOfDetail::MEDIUM)
painter->setBrush(QColor(206, 211, 219));
painter->drawEllipse(m_airport_significance_rect);
else if(m_curr_lod == LevelOfDetail::HIGH)
painter->setBrush(QColor(56, 55, 52, 150));
painter->drawEllipse(m_airport_boundary);
DrawRunways(painter, option, widget);
else
painter->setBrush(QColor(56, 55, 52));
painter->drawEllipse(m_airport_boundary);
pen.setStyle(Qt::PenStyle::SolidLine);
pen.setColor(Qt::black);
painter->setPen(pen);
DrawRunways(painter, option, widget);
DrawILS(painter, option, widget);
DrawCOM(painter, option, widget);
QPen pen;
pen.setStyle(Qt::PenStyle::SolidLine);
pen.setColor(Qt::white);
pen.setWidth(0);
QFont font("Arial");
font.setPixelSize(15);
painter->setFont(font);
painter->setPen(pen);
painter->drawText(m_airport_boundary, "TEST");
drawText 调用似乎根本不起作用。我在这个缩放级别的比例非常小。 m_airport_boundary QRectF 变量具有以下值: x = -0.010286252057250001, y = -0.010286252057250001, 宽度 = 0.020572504114500002, 高度 = 0.020572504114500002
m_airport_boundary 矩形的绘图是可见的,所以我知道我试图在正确的位置绘图。谁能告诉我我做错了什么?
正在绘制的屏幕截图... 黑圈是 m_airport_boundary 椭圆。绿色的东西是 DrawILS 的结果,蓝色的圆圈是 DrawCOM
【问题讨论】:
能否添加当前结果的截图? @S.Monteleone 我已经更新了帖子。感谢您的关注。 感谢截图。您在哪里以及如何为画家设置 QFont? 更新了代码。这就是我截取屏幕截图的来源。 谢谢。您在 DrawILS 或 DrawCOM 中调用任何painter->setTransform() 吗?如果是这样,那么您应该在尝试绘制文本之前恢复当前转换。如果这是答案,请告诉我,我会将其添加为您问题的答案。 【参考方案1】:当前的 QTransform 比例正在影响字体大小。
我建议计算屏幕空间中的文本位置,重置变换,然后调用 drawText()。
这是一个sn-p(假设你想在中心画):
QPointF pos = m_airport_boundary.center();
QTransform t = painter->transform();
painter->resetTransform();
pos = t.map(pos);
painter->drawText(pos, "TEST");
【讨论】:
谢谢!我快疯了!既然您指出了这一点,那就完全有道理了!以上是关于在 QGraphicsWidget::paint 函数中绘制文本的主要内容,如果未能解决你的问题,请参考以下文章
NOIP 2015 & SDOI 2016 Round1 & CTSC 2016 & SDOI2016 Round2游记