调用Qt的的QGraphicsView :: setViewport使用自定义QGLWidget来绘图
-
12-09-2019 - |
题
我已经从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()?
解决方案 5
我要继续前进,回答我的问题。这是不是最佳的,但是这是我如何解决该问题得到。
相反
的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;
}
我不认为这是为了做到这一点的最佳方式,但它比不具有特定的初始化步骤在所有的替代更好。我仍然很高兴有别人留下一个更好的答案!
其他提示
自定义的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()
而不是当该插件被构造。这可以尽可能晚发生,因为当部件被第一可见。