est*_*tan 5 c++ qt qgraphicsview
我正在使用Qt的图形视图框架可视化图形。看起来像这样:

现在,我希望将顶点绘制为较小的实心圆,使其相对于视图缩放保持恒定。目前,我不通过将顶点作为场景中的项来实现此目的,而是在视图的drawForeground(...)函数中绘制它们,如下所示:
void View::drawForeground(QPainter *painter, const QRectF& rect) {
painter->setMatrixEnabled(false);
painter->setPen(Qt::NoPen);
painter->setBrush(Qt::black);
painter->setRenderHint(QPainter::Antialiasing);
// Draw points.
const QRectF biggerRect = rect.adjusted(-100, -100, 100, 100);
const float radius = 2.0;
foreach (const QPointF& point, m_points) {
if (biggerRect.contains(point)) {
painter->drawEllipse(QPointF(mapFromScene(point)), radius, radius);
}
}
// ...
}
Run Code Online (Sandbox Code Playgroud)
但这是糊涂的,而且是错误的,因为从概念上讲,这些顶点是我场景的一部分,并且应该是我场景中的项目QGraphicsScene。另外,例如,我可能想暂时隐藏一组顶点,或对其进行变换,如果它们是场景中的适当项目,则这样做会容易得多。最后但并非最不重要的一点是,让视图绘制点会破坏模型/视图的分离,并迫使视图知道它们正在显示的点(可能有多个视图)。
使用这种方法时,render(...)在查看时,顶点(非项目)和边(项目)的相对位置也遇到了麻烦,这QSvgGenerator可能是由于我禁用画家变换的技巧而导致的。
因此,我的问题是:QGraphicsItem在显示场景的每个视图中,如何将顶点添加到场景中,同时相对于视图仍保持其大小不变?
我尝试在项目上设置QGraphicsItem :: ItemIgnoresTransformations标志。文档中有关于该标志的说明:
该项目将忽略继承的转换(即,其位置仍固定在其父项上,但是将忽略父项或视图的旋转,缩放或剪切转换)。此标志对于保持文本标签项目水平和不缩放很有用,因此,如果对视图进行了转换,它们仍将可读。设置后,项目的视图几何和场景几何将分别维护。您必须调用deviceTransform()来映射坐标并检测视图中的碰撞。默认情况下,此标志是禁用的。这个标志是在Qt 4.3中引入的。
但是设置此标志会导致所有视图转换都被忽略,因此当我放大时,点将不再显得进一步分开,这不是我想要的。我只希望项目大小(以屏幕像素为单位)保持不变。
由于Merlin069要求这样做:我尝试使用此标志时使用的代码只是将每个顶点添加到场景中,如下所示:
QGraphicsEllipseItem *item = scene->addEllipse(x - 2.0, y - 2.0, 4.0, 4.0);
item->setPen(Qt::NoPen);
item->setBrush(Qt::black);
item->setFlag(QGraphicsItem::ItemIgnoresTransformations);
Run Code Online (Sandbox Code Playgroud)
下面是我得到的屏幕截图。放大2倍,4倍,8倍时,项目大小保持不变(是),但是两点之间的屏幕距离也是如此:(

对此解决方案的任何提示/指针都将不胜感激!
如果您查看 addEllipse 的文档,它会指出:-
创建椭圆项目并将其添加到场景中,并返回项目指针。椭圆的几何形状由 rect 定义,其画笔和画笔初始化为 pen 和 Brush。
请注意,项目的几何形状在项目坐标中提供,并且其位置初始化为 (0, 0)。
因此,您在这里所做的是将所有项目放置在 (0,0) 处,但项目的矩形正在发生变化。您需要做的是创建项目并设置它们的位置。