我以前也是从QGLWidget派生出来的,比如:
class MyGLWidget : public QGLWidget
{
public:
// stuff...
virtual void initializeGL() { /* my custom OpenGL initialization routine */ }
// more stuff...
};然而,我发现如果我试图用我的自定义QGLWidget作为视区来初始化一个QGraphicsView,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()中的代码放在哪里才是正确的位置?
发布于 2009-08-03 19:01:36
我将继续回答我自己的问题。这并不是最优的,但这就是我解决问题的方法。
而不是
ui.graphicsView->setViewport(new MyGLWidget(QGLFormat(QGL::DoubleBuffer)));相反,我得到了这个:
ui.graphicsView->setViewport(new QGLWidget(new CustomContext(QGLFormat(QGL::SampleBuffers))));CustomContext是从QGLContext派生的类。我覆盖了create成员,如下所示:
virtual bool create(const QGLContext *shareContext = 0)
{
if(QGLContext::create(shareContext))
{
makeCurrent();
/* do my initialization here */
doneCurrent();
return true;
}
return false;
}我不认为这是最好的方法,但它比没有特定初始化步骤的替代方法要好。我还是很高兴有人给我留下更好的答案!
发布于 2010-03-24 17:10:54
自定义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();
}
};发布于 2009-11-17 07:41:03
所以我发现QGraphicsView会在你的QGLWidget视窗上安装一个自定义的eventFilter,所以它永远不会看到初始化/调整大小/重新绘制事件。这可能是为了让它与drawBackground()等一起正常工作。
我目前最好的解决方案是在QGraphicsView::resizeEvent()/etc中捕获所需的事件,或者在您的QGLWidget派生类上安装一个自定义eventFilter,以便在QGraphicsView的自定义eventFilter接受它们之前捕获调整大小/绘制等事件。
https://stackoverflow.com/questions/1112167
复制相似问题