我只是想知道Qt上的QOpenGLWidget(我使用的是5.4版)是否可以在没有子类化的情况下使用。
在Qt Creator表单编辑器中,有一个Display小部件可以插入名为" OpenGL Widget"的表单中。插入时小部件显示为黑色,是QOpenGLWidget对象。编译不会抛出错误,例如必须实现initializedGL()虚函数。
可用的Qt帮助和示例仅显示如何通过子类化来使用此对象。这种方法违背了工具栏上有一个可插入对象的目的,所以我想也许有办法。
我注意到这个小部件有像makeCurrent()这样的函数,我认为这些函数很有用。
由于
答案 0 :(得分:1)
这种方法违背了工具栏上有一个可插入对象的目的,所以我想也许有办法。
您必须是子类,但您还希望.ui
文件使用正确派生类的窗口小部件,而不是基类的窗口小部件。
有两种方法可以解决这个问题:
插入基类小部件。然后promote it到派生类。您也可以editing the .ui
file手动执行此操作。
为您的班级制作custom widget Designer plugin。请注意,此插件(和小部件!)必须使用与编译Qt Creator本身相同的Qt版本/配置进行编译,因此在大多数情况下,您必须首先编译Qt Creator。
如果您认真对待Qt中的开发,那么您可能拥有自己的Designer和Creator插件,并且您将自己构建Creator,以及Qt。
答案 1 :(得分:0)
你可以通过继承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();
}
因此,您的渲染代码并未与显示小部件相关联。
答案 2 :(得分:0)
我刚做了一些实验,发现QOpenGLWidget可以很容易地使用,无需子类化。
插入以下代码
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绘图函数,这可能不适合模块化狂热分子。