【问题标题】:QOpenGLWidget without subclassing没有子类化的 QOpenGLWidget
【发布时间】:2016-08-30 22:29:57
【问题描述】:

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

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

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

我注意到该小部件具有诸如 makeCurrent() 之类的函数,我认为这可能很有用。

谢谢

【问题讨论】:

    标签: c++ qt opengl qt-creator


    【解决方案1】:

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

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

    有两种方法:

    1. 插入基类小部件。然后promote it 到派生类。您也可以通过editing the .ui file手动完成。

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

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

    【讨论】:

    • 感谢您的回答。但是我还是不明白为什么 QTCreator 中的 Designer 调色板有一个可插入的 QOpenGLWidget,而事实上它必须被子类化(或提升)。
    • 想象一下它不存在。你会从什么推广? QWidget。您将无法访问QOpenGLWidget 可能拥有的所有属性,而您的派生小部件也拥有这些属性。而且您的.ui 的自我记录会少得多。
    【解决方案2】:

    你可以通过继承一个 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();
        }
    

    因此您的渲染代码不会绑定到显示小部件。

    【讨论】:

      【解决方案3】:

      我刚刚做了一些实验,发现 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

      因此不需要子类化,但是包含一个设置投影矩阵和纵横比的初始化函数可能很有用。

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-11-09
        • 1970-01-01
        • 1970-01-01
        • 2010-11-17
        • 2012-10-05
        • 2013-08-02
        • 2016-08-30
        • 1970-01-01
        相关资源
        最近更新 更多