像QGraphicsView上的功能分开的图层

时间:2012-04-05 10:36:47

标签: qt qgraphicsview qgraphicsscene

在我的QGraphicsView中,我会显示一张地图。我需要在上边缘和左边缘上分别显示水平标尺和垂直标尺。

地图需要滚动,但上面的标尺应显示在固定位置,但会更改其比例值。

我尝试使用drawForeground方法实现此功能。由于地图大,我只绘制可见区域。每次滚动完成后我都需要update()。但这个结果有时会闪烁。

我觉得最好有单独的图层方法。

解决问题的最佳方法是什么?

2 个答案:

答案 0 :(得分:2)

在顶部和左侧实现标尺的正确方法是从QGraphicsView派生,然后在构造函数中调用:

// add two rulers on top and left.
setViewportMargins(20, 20, 0, 0);

// add grid layout
QGridLayout* gridLayout = new QGridLayout();
gridLayout->setSpacing(0);
gridLayout->setMargin(0);

// create rulers
hRuler = new Ruler(Qt::Horizontal);
vRuler = new Ruler(Qt::Vertical);

// add items to grid layout
QWidget* corner = new QWidget();
corner->setBackgroundRole(QPalette::Window);
corner->setFixedSize(20, 20);
gridLayout->addWidget(corner, 0, 0);
gridLayout->addWidget(hRuler, 0, 1);
gridLayout->addWidget(vRuler, 1, 0);
gridLayout->addWidget(viewport(), 1, 1);

// finally set layout
setLayout(gridLayout);

此解决方案最初为presented here,效果非常好。结果looks like this

答案 1 :(得分:0)

我刚刚将图形视图的ViewportUpdateMode更改为FullViewportUpdate以摆脱闪烁。

您也可以使用SmartViewportUpdate获得更好的效果。

缺点是,在动画期间,这需要更多的处理能力。