【问题标题】:qt openGL - draw triangleqt openGL - 绘制三角形
【发布时间】:2015-05-26 03:00:30
【问题描述】:

所以我的目标是(首先)用 openGL 绘制一个三角形。

我的问题:

1) 如何/何时调用我的两个函数?我看到只有一个被调用。即 void MyGLWidget::paintGL。我很困惑,因为你可以看到我从不调用这个函数,它会自动调用。我在我的 ui 上添加了一个小部件,我将它提升为 MyGLWidget。但是何时/为什么/如何(不)调用它?

我的代码: myglwidget.cpp

#include "myglwidget.h"
#include <QtWidgets>
#include <QtOpenGL>
#include <GL/glu.h>


MyGLWidget::MyGLWidget(QWidget *parent)
    : QGLWidget(QGLFormat(QGL::SampleBuffers), parent)
{
}

void MyGLWidget::initializeGL()
{
    glClearColor(1,1,0,1);
    qDebug("init"); //<-------never gets printed
}

void MyGLWidget::paintGL()
{
    glClear(GL_COLOR_BUFFER_BIT);
    qDebug("painting"); //<---- does get printed
    glColor3f(1,0,0);
    glBegin(GL_TRIANGLES);
        glVertex3f(-0.5,-0.5,0);
        glVertex3f(0.5,-0.5,0);
        glVertex3f(0.0,0.5,0);
    glEnd();
}

myglwidget.h

#ifndef MYGLWIDGET_H
#define MYGLWIDGET_H
#include <QGLWidget>

class MyGLWidget : public QGLWidget
{
    Q_OBJECT
public:
   explicit MyGLWidget(QWidget *parent = 0);

   void initializeGL();
   void paintGL();
   void resizeGL(int width, int height);
private:

};

#endif // MYGLWIDGET_H

main.cpp

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    Widget w;
    w.setWindowTitle("OpenGL with Qt DAO");
    w.show();

    return a.exec();
}

【问题讨论】:

    标签: c++ qt user-interface opengl


    【解决方案1】:

    我没有看到你创建的一个名为 Widget 的类连接到 MyGlWidget 类。也许我错了,但你不应该创建一个 MyGlWidget 的实例(调用它的构造函数而不是 Widget?)

    【讨论】:

    • 确实如此!我不做任何实例或任何东西,但函数会被调用!
    • 但是你不是说你将小部件提升为'MyGLWidget'吗?你是怎么做到的?与设计师?
    • 是的,我是和设计师一起做的。我不得不承认我真的不知道这个促销是做什么的......
    【解决方案2】:

    这两个函数都由 QGLWidget 超类在内部调用。见QT Docs

    在文档中,您还可以看到这些虚拟功能受到保护。在您的代码中,它们是public。所以你必须改变它才能让它发挥作用。

    【讨论】:

    • 我把这两个函数都放在了protected中。但是只有一个被调用,初始化函数没有被调用。为什么?
    猜你喜欢
    • 1970-01-01
    • 2020-12-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多