我从QGLWidget来绘图衍生之前,就像这样:
class MyGLWidget : public QGLWidget
{
public:
// stuff...
virtual void initializeGL() { /* my custom OpenGL initialization routine */ }
// more stuff...
};
然而,我发现,如果我尝试初始化的QGraphicsView与我的自定义QGLWidget来绘图视口,initializeGL不会被调用(Qt库中设置断点,同样没有QGLWidget来绘图:: initializeGL()时创建平原)。
// initializeGL, resizeGL, paintGL not called
ui.graphicsView->setViewport(new MyGLWidget(QGLFormat(QGL::DoubleBuffer)));
// initializeGL, resizeGL, paintGL *still* not called
ui.graphicsView->setViewport(new QGLWidget(QGLFormat(QGL::DoubleBuffer)));
哪里是正确的位置放置,目前居住在MyGLWidget :: initializeGL()的代码?
一个自定义的QGraphicsView的setupViewport时隙可用于呼吁QGLWidget来绘图updateGL(),这将导致initializeGL()被调用。
class MyGraphicsView : public QGraphicsView
{
//... The usual stuff
protected slots:
virtual void setupViewport(QWidget *viewport)
{
QGLWidget *glWidget = qobject_cast<QGLWidget*>(viewport);
if (glWidget)
glWidget->updateGL();
}
};
那么,我发现是的QGraphicsView安装到您QGLWidget来绘图视定制eventFilter所以它永远不会看到初始化/调整/重绘事件。 这可能是为了使其与drawBackground正常工作()等。
我目前最好的解决方案是捕获所需的事件无论是在的QGraphicsView :: resizeEvent()/等,或在你的QGLWidget来绘图派生类安装自定义eventFilter赶上调整大小/油漆/等的QGraphicsView的定制eventFilter吞食它们之前的事件。
疼痛,疼痛,...从整合到QGlWidgets衍生的QGraphicsView部件没有什么好玩的Qt的,我知道这肯定是混乱的地区之一的部分。 我结束了使用的一部分kgllib (出KDE的)呼吁widgetproxy是围绕一个QGLWidget来绘图一个非常体面的包装。 我修改了它适合我的需要,但效果相当好了,你想使用QGLWidget来绘图衍生的QGraphicsView内的exisiting类,并在它上面画其他的东西最一般的情况下。
initializeGL()
将不会被调用,直到第一次调用要么paintGL()
或resizeGL()
而不是当小部件构成。 这可能会迟当widget被首次提出可见的发生。
我要继续前进,回答我的问题。 这是不是最佳的,但是这是我如何解决该问题得到。
代替
ui.graphicsView->setViewport(new MyGLWidget(QGLFormat(QGL::DoubleBuffer)));
我有这个:
ui.graphicsView->setViewport(new QGLWidget(new CustomContext(QGLFormat(QGL::SampleBuffers))));
CustomContext是从QGLContext派生的类。 我已经覆盖了创建成员,就像这样:
virtual bool create(const QGLContext *shareContext = 0)
{
if(QGLContext::create(shareContext))
{
makeCurrent();
/* do my initialization here */
doneCurrent();
return true;
}
return false;
}
我不认为这是为了做到这一点的最佳方式,但它比不具有特定的初始化步骤在所有的替代更好。 我仍然很高兴有别人留下一个更好的答案!