QOpenGLWidget没有子类化

QOpenGLWidget without subclassing

本文关键字:子类 QOpenGLWidget      更新时间:2023-10-16

我只是想知道QOpenGLWidget是在Qt上(我使用版本5.4)可以不子类化使用。

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

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

我注意到这个小部件有一些函数,比如makeccurrent(),我认为这些函数可能很有用。

谢谢

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

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

有两种方法:

  1. 插入基类小部件。然后将其提升到派生类。您也可以通过编辑.ui文件来手动完成。

  2. 为您的类创建一个自定义小部件设计器插件。请注意,这个插件(和小部件!)必须使用与编译Qt Creator本身相同的Qt版本/配置来编译,所以在大多数情况下,您必须首先编译Qt Creator本身。

如果你对Qt开发很认真,你可能会有自己的Designer和Creator插件,你会自己构建Creator,以及Qt。

您可以通过子类化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();
    }

因此,您的呈现代码不绑定到显示小部件。

我只是做了一些实验,我发现QOpenGLWidget可以很容易地使用,而不需要子类化。

  1. 插入"OpenGLWidget"(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. 运行并单击按钮,您应该看到这个截图

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

而且这些GL绘图函数必须在主窗口内调用,这对于模块化狂热者来说可能不是理想的。