QOpenGLWidget没有子类化
QOpenGLWidget without subclassing
我只是想知道QOpenGLWidget是在Qt上(我使用版本5.4)可以不子类化使用。
在Qt Creator,表单编辑器中,有一个名为"OpenGL widget"的显示小部件可以插入到表单中。插入小部件时显示黑色,并且是QOpenGLWidget对象。编译不会抛出错误,例如必须实现initializedGL()虚函数。
可用的Qt帮助和示例仅显示如何通过子类化该对象来使用它。这有点违背了在工具栏上有一个可插入对象的目的,所以我想也许有一种方法。
我注意到这个小部件有一些函数,比如makeccurrent(),我认为这些函数可能很有用。
谢谢
这有点违背了在工具栏上有一个可插入对象的目的,所以我想也许有一种方法。
您必须创建子类,但是您还希望.ui
文件使用正确的派生类的小部件,而不是基类的小部件。
有两种方法:
-
插入基类小部件。然后将其提升到派生类。您也可以通过编辑
.ui
文件来手动完成。 -
为您的类创建一个自定义小部件设计器插件。请注意,这个插件(和小部件!)必须使用与编译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可以很容易地使用,而不需要子类化。
- 插入"OpenGLWidget"(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(); }
-
运行并单击按钮,您应该看到这个截图
所以不需要子类化,但是包含一个设置投影矩阵和长宽比的初始化函数可能是有用的。
而且这些GL绘图函数必须在主窗口内调用,这对于模块化狂热者来说可能不是理想的。
- 继承期间显示未知行为的子类
- 通过指向指针数组的指针访问子类的属性
- 从父类方法返回子类对象
- c++, 在子类中,如何在没有对象的情况下访问父类的方法?
- 将父类对象强制转换为子类的问题
- 避免在C++中重复子类定义
- 将QOpenGLWidget子类转换为使用Metal而不是OpenGL的子类是否可行?
- 如何初始化矢量的模板化子类
- C++ 继承:将子类传递给需要基类的函数并获取子类行为
- 有没有办法按值将纯抽象类的所有子类传递给 C++ 中的函数?
- 使用子类覆盖基类中定义的函数
- 子类地址等于虚拟基类地址?
- 将子类方法声明为基类的友元
- C++子类共享变量?
- 如何检查模板专用化是否是基本模板的子类?
- 仅让特定类'Fabric'构造类'Foo'及其所有子类的实例
- 使用模板参数重载C++方法:如何使其适用于模板的子类?
- 基类中的默认析构函数禁用子类中的移动构造函数(如果有成员)
- 如何在C++子类中访问父类的私有变量
- QOpenGLWidget没有子类化