没有子类化的 QOpenGLWidget

Posted

技术标签:

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

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

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

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

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

谢谢

【问题讨论】:

【参考方案1】:

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

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

有两种方法:

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

    为您的班级创建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 可以非常容易地使用,无需子类化。

    插入“Open GL Widget”(QOpenGLWidget 对象) 插入一个按钮并转到“clicked()”槽。

    插入以下代码

    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();
    
    

    运行并单击按钮,您应该会看到这个 screenshot

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

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

【讨论】:

以上是关于没有子类化的 QOpenGLWidget的主要内容,如果未能解决你的问题,请参考以下文章

win32 c++ 在没有子类化的编辑控件中检测“输入”?

QListView 拒绝显示子类化的 QAbstractListModel

在没有太多列名的情况下存储有关模型的额外信息的策略(数据库规范化和模型子类化的替代方案)

effective java学习笔记之不可实例化的类

NSLog'd 时子类化的 NSManagedObject 不调用描述

子类化的 SKSpriteNode 触摸事件被忽略