没有子类化的 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的主要内容,如果未能解决你的问题,请参考以下文章
QListView 拒绝显示子类化的 QAbstractListModel
在没有太多列名的情况下存储有关模型的额外信息的策略(数据库规范化和模型子类化的替代方案)