C++ 多视图中固定大小的QGraphics站点?

C++ 多视图中固定大小的QGraphics站点?,c++,qt,qgraphicsview,C++,Qt,Qgraphicsview,我正在使用Qt的图形视图框架可视化图形。它看起来像这样: 现在,我希望顶点的大小(我正在绘制为小填充圆)相对于视图的缩放保持不变。目前,我没有将顶点作为场景中的项目,而是在视图的drawForeground(…)函数中绘制它们来实现这一点,如下所示: void视图::drawForeground(QPainter*painter、const qrect和rect){ painter->setMatrixEnabled(false); 画师->设置笔(Qt::NoPen); 画家->挫折(Qt:

我正在使用Qt的图形视图框架可视化图形。它看起来像这样:

现在,我希望顶点的大小(我正在绘制为小填充圆)相对于视图的缩放保持不变。目前,我没有将顶点作为场景中的项目,而是在视图的
drawForeground(…)
函数中绘制它们来实现这一点,如下所示:

void视图::drawForeground(QPainter*painter、const qrect和rect){
painter->setMatrixEnabled(false);
画师->设置笔(Qt::NoPen);
画家->挫折(Qt::黑色);
painter->setRenderHint(QPainter::抗锯齿);
//抽签。
常量QRectF biggerRect=调整后的矩形(-100,-100100100);
常量浮动半径=2.0;
foreach(常数点和点、m_点){
if(biggerRect.contains(点)){
画师->抽屉(QPointF(mapFromScene(点)),半径,半径);
}
}
// ...
}
但这是一个笨拙的错误,因为顶点在概念上是我场景的一部分,应该是我的
qgraphicscene
中的项目。另外,作为一个例子,我可能想暂时隐藏一组顶点,或者对它们进行变换,如果它们是场景中的适当项目,那么这样做会容易得多。最后但并非最不重要的一点是,让视图绘制点会打破模型/视图的分离,并强制视图了解它们所显示的点(可能有多个视图)

使用这种方法,我还遇到了顶点(非项目)和边(项目)的相对位置错误的问题,当
渲染(…)
将视图添加到
QSvgGenerator
时,这可能是因为我禁用了画师转换的技巧

因此,我的问题是:在显示场景的每个视图中,如何将顶点作为
QGraphicsItem
s添加到场景中,同时使其相对于视图的大小保持不变

我试过在这些物品上设置标志。文档中对标志有如下说明:

该项忽略继承的变换(即,其位置仍定位到其父项,但忽略父项或视图旋转、缩放或剪切变换)。此标志对于保持文本标签项水平且不缩放非常有用,因此,如果视图被转换,它们仍然是可读的。设置后,将分别维护项目的视图几何体和场景几何体。必须调用deviceTransform()来映射视图中的坐标并检测碰撞。默认情况下,此标志处于禁用状态。Qt4.3中引入了此标志

但是设置此标志会导致忽略所有视图转换,这样当我放大时,点将不再显示为进一步分开,这不是我想要的。我只希望项目大小(在屏幕上的像素)保持不变

因为Merlin069要求这样做:我在尝试使用此标志时使用的代码只是将每个顶点添加到场景中,如下所示:

QGraphicsEllipseItem*item=scene->addEllipse(x-2.0,y-2.0,4.0,4.0);
项目->设置笔(Qt::NoPen);
项目->退刀(Qt::黑色);
item->setFlag(QGraphicsItem::ItemIgnoresTransformations);
下面是我当时得到的截图。放大2倍、4倍、8倍,项目大小保持不变(耶),但屏幕上点之间的距离也保持不变:(


非常感谢您提供有关此解决方案的任何提示/建议!

如果您查看文档中的附录,它会说明:-

创建椭圆项目并将其添加到场景中,然后返回项目指针。椭圆的几何体由rect定义,其笔和画笔初始化为笔和画笔

请注意,项目的几何图形在项目坐标中提供,其位置初始化为(0,0)

因此,您在这里所做的是将所有项放置在(0,0),但项的矩形正在更改。您需要做的是创建项,然后设置它们的位置

QGraphicsItem::setFlag(QGraphicsItem::ItemIgnoresTransformations,true);

这应该可以解决问题。

你能展示你在QGraphicsItem::ItemIgnorestTransformations中使用的代码吗?我希望如果视图缩小,这些点在场景中的大小和位置应该保持不变,所以它们看起来应该是分散的。啊,观点很好。将我用于此的代码添加到我的问题中。你在哪里设置elli的位置PSE?仅仅添加它们就可以将它们设置为场景中的(0,0)。啊!就是这样。出于某种原因,我假设
x
y
addEllipse(…)
参数是场景坐标。但是它们是在项目坐标中。将
0,0
传递到
addEllipse(…)
并执行
setPos(x-2.0,y-2.0)
而且效果很好。非常感谢!(如果您愿意,请添加此作为答案,我会接受。)完成,很高兴我们最终到达了目的地;O)现场。再次感谢。它确实。。。但前提是您了解项目的局部坐标空间和场景空间之间的差异。这个答案本身并没有多大帮助。