QGLWidget + QGraphicsScene + QGraphicsView问题

时间:2010-05-05 21:20:05

标签: c++ qt4

我想使用QGLWidget,QGraphicsScene和QGraphicsView创建一个简单的缩略图查看器。我将QGLWidget放在QGraphicsScene上有问题。代码类似于:

QGraphicsScene *testScene = new QGraphicsScene (0, 0, 400, 400, 0);

QGLWidget *testWidget1 = new QGLWidget();
testWidget1->renderText("Test text1");

QGLWidget *testWidget2 = new QGLWidget();
testWidget2->renderText("Test text2");

testScene->addWidget(testWidget1);
testScene->addWidget(testWidget2);

QGraphicsView *testView = new QGraphicsView();
testView->setScene(testScene);
testView->show()

可以在QGraphicsScene / QGraphicsView上放置几个QGLWidgets吗?我做错了什么?有没有其他组件可以嵌入QGLWidgets并在屏幕上显示它们?

感谢您的帮助

3 个答案:

答案 0 :(得分:2)

要在QGraphicsView中显示QGLWidget,您应该为其重定向绘画。您可以像这样覆盖paintGL:

virtual void MyGLWidget::paintGL()
{
    QGLWidget::paintGL();
    //support redirecting painting
    QPaintDevice* device = QPainter::redirected(this);
    if (device != NULL && device != this)
    {
        QImage image = grabFrameBuffer();
        QPainter painter(this);
        painter.drawImage(QPointF(0.0,0.0),image);
    }
}

它适用于大多数平台,但仍然会显示黑色小部件。

答案 1 :(得分:1)

QGraphicsScene::addWidget documentation表示QGLWidget不是受支持的窗口小部件类型。

QGLWidget托管到QGraphicsView的视口上似乎也不起作用。

修改

实际上,如果我将QGLWidget调用放在我的测试GL小部件的renderText方法中,那么将paintGL托管到视口会有效。

答案 2 :(得分:0)

来自QGraphicsView文档:

  

要使用OpenGL渲染,只需调用setViewport(new QGLWidget)即可。 QGraphicsView获得视口小部件的所有权。

因此,为了在视图上绘制文字,请使用QGraphicsTextItem而不是尝试使用QGLWidget绘制文字。