【问题标题】:QGLWidget + QGraphicsScene + QGraphicsView problemQGLWidget + QGraphicsScene + QGraphicsView 问题
【发布时间】:2011-02-16 03:20:55
【问题描述】:

我想使用 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 并将它们显示在屏幕上?

感谢您的帮助

【问题讨论】:

    标签: c++ qt4


    【解决方案1】:

    要让 QGLWidget 在 QGraphicsView 中显示,你应该为它重定向绘画。你可以像这样覆盖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);
        }
    }
    

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

    【讨论】:

      【解决方案2】:

      QGraphicsScene::addWidget documentation 声明 QGLWidget 不是受支持的小部件类型。

      QGLWidget 放在QGraphicsView 的视口上似乎也不起作用。

      编辑:

      如果我将 renderText 调用放在我的测试 GL 小部件的 paintGL 方法中,实际上将 QGLWidget 设置为视口的父级确实有效。

      【讨论】:

        【解决方案3】:

        来自QGraphicsView 文档:

        要使用 OpenGL 进行渲染,只需调用 setViewport(new QGLWidget)。 QGraphicsView 拥有视口小部件的所有权。

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2017-02-16
          • 2011-06-26
          • 1970-01-01
          • 1970-01-01
          • 2017-02-06
          • 2013-11-19
          相关资源
          最近更新 更多