QOpenGLWidget没有子类化

时间:2016-08-30 22:29:58

标签: c++ qt opengl qt-creator

我只是想知道Qt上的QOpenGLWidget(我使用的是5.4版)是否可以在没有子类化的情况下使用。

在Qt Creator表单编辑器中,有一个Display小部件可以插入名为" OpenGL Widget"的表单中。插入时小部件显示为黑色,是QOpenGLWidget对象。编译不会抛出错误,例如必须实现initializedGL()虚函数。

可用的Qt帮助和示例仅显示如何通过子类化来使用此对象。这种方法违背了工具栏上有一个可插入对象的目​​的,所以我想也许有办法。

我注意到这个小部件有像makeCurrent()这样的函数,我认为这些函数很有用。

由于

3 个答案:

答案 0 :(得分:1)

  

这种方法违背了工具栏上有一个可插入对象的目​​的,所以我想也许有办法。

您必须是子类,但您还希望.ui文件使用正确派生类的窗口小部件,而不是基类的窗口小部件。

有两种方法可以解决这个问题:

  1. 插入基类小部件。然后promote it到派生类。您也可以editing the .ui file手动执行此操作。

  2. 为您的班级制作custom widget Designer plugin。请注意,此插件(和小部件!)必须使用与编译Qt Creator本身相同的Qt版本/配置进行编译,因此在大多数情况下,您必须首先编译Qt Creator。

  3. 如果您认真对待Qt中的开发,那么您可能拥有自己的Designer和Creator插件,并且您将自己构建Creator,以及Qt。

答案 1 :(得分:0)

你可以通过继承shell小部件来做这样的事情

    void OpenGLDisplayWidget::initializeGL()
    {

        m_renderer->initialise(context());
    }

    void OpenGLDisplayWidget::resizeGL(int w, int h)
    {
        m_renderer->resize(w, h);
    }

    void OpenGLDisplayWidget::paintGL()
    {
        m_renderer->draw();
    }

因此,您的渲染代码并未与显示小部件相关联。

答案 2 :(得分:0)

我刚做了一些实验,发现QOpenGLWidget可以很容易地使用,无需子类化。

  1. 插入“Open GL Widget”(QOpenGLWidget对象)
  2. 插入按钮并转到“clicked()”插槽。
  3. 插入以下代码

    void MainWindow::on_pushButton_clicked()
    {
        ui->openGLWidget->makeCurrent();
    
        //Paint a colorful triangle
    
        glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    
        glBegin(GL_TRIANGLES);
        glColor3f(1.0, 0.0, 0.0);
        glVertex3f(-0.5, -0.5, 0);
        glColor3f(0.0, 1.0, 0.0);
        glVertex3f( 0.5, -0.5, 0);
        glColor3f(0.0, 0.0, 1.0);
        glVertex3f( 0.0,  0.5, 0);
        glEnd();
    }
    
  4. 运行并单击按钮,您应该看到这一点 screenshot

  5. 所以不需要子类,但是包含一个设置投影矩阵和宽高比的初始化函数可能很有用。

    此外,必须在主窗口内调用这些GL绘图函数,这可能不适合模块化狂热分子。