QT 4.5 - 我怎么在一个的QGraphicsView

问题描述:

我试图做一个绘画程序与QT 4.5得到了QPainter设备,所以我用了的QGraphicsView的画布,QGraphicsScene存储绘制的项目。因为某些原因,我不能在我自己得出的QGraphicsView得到了QPainter上下文QT 4.5 - 我怎么在一个的QGraphicsView

class DrawingCanvas : public QGraphicsView 
{ 
    DrawingCanvas::DrawingCanvas(QWidget * parent); 

... 
}; 

DrawingCanvas::DrawingCanvas(QWidget * parent = 0) : QGraphicsView(parent) 
{ 
    .... 
} 

void DrawingCanvas::paintEvent(QPaintEvent& paintEventInfo) 
{ 
    // Result in painter not active 
    QPainter(this); 
    ... 
} 

但是,如果我改变DrawingCanvas是QWidget中的孩子,它的工作原理。看到QGraphicsView是从QAbstractScrollArea派生的,然后是QFrame,然后是QWidget,我期望代码能够工作。

所以我想的问题是:

1),这是为什么我不能使用的paintEvent中的QGraphicsView得到积极的QPainter? 2)有可能我可以得到一个?

在此先感谢!

如果还有人想知道这是否可能,答案是肯定的。

短版

void DrawingCanvas::paintEvent(QPaintEvent& paintEventInfo) 
{ 
    // Result in painter active 
    QPainter(viewport()); 
    ... 
} 

龙版

QGraphicsScene不上本身没有绘画,而是画在你给它或默认一个QWidget的视角构件。

通过画视口,而不是就可以实现重叠的画,将对齐到视图,而不是现场。或者,你可以使用QGlWidget和它的paintOverlayGl()。

还记得设置viewportUpdateMode(的QGraphicsView :: FullViewportUpdate),或者你会得到渲染缺陷。有可能是一个更聪明的方法来避免工件,而不是每次更新整个视图,但直到遇到性能问题时,我会让它休息。

对,拔出我的头发一段时间后,这似乎是不可能的,所以这是我的解决方案。你绘制的所有东西都必须添加到QGraphicsScene;所以你从它派生你自己的实现。

最简单的方法是定义一个临时的QGraphicsItem指针要绘制线条,矩形和等。

相应地覆盖虚拟mousePressed(),mouseMove()和mouseRelease()事件。在mousePressed()上,初始化临时QGraphicsItem指针并将其添加到场景中。

在mouseMoved()中,相应地设置临时QGraphicsItem的坐标。对于mouseReleased,创建一个临时对象的副本并将其添加到场景中,并从场景中移除临时QGraphicsItem(您一直用于绘制线条,矩形等)。

我推测它的寓意是,有一个的QGraphicsView内没有了QPainter上下文,你最好忽略了它的paintEvent()。

希望这可以帮助那些可能偶然发现的人。

+1

我刚刚经历了这个完全相同的过程>。 mpen 2009-08-31 01:19:41

还有另一种可能性:在查看覆盖drawForeground。根据您需要绘制的项目类型,这可能是一个非常简单的解决方案(例如,标记线叠加),或者有时比在场景中创建自定义项目更多的工作 - 取决于您期望的结果。