2

我使用 QGLWidget 编写了一个小型 QT 程序。目标是在永久旋转中显示一个简单的三角形。问题是没有动画,因为只渲染了第一帧。

这是我的主要 C++ 源代码:

#include "qtapplication.h"
#include <QtWidgets/QApplication>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    QtApplication w;
    w.show();
    return a.exec();
}

我的 qtapplication.h 文件:

include <QtWidgets/QMainWindow>
#include "ui_qtapplication.h"
#include "HSGLWidget.hpp"

class QtApplication : public QMainWindow
{
    Q_OBJECT

public:
    QtApplication(QWidget *parent = 0);
    ~QtApplication();

private:
    Ui::QtApplicationClass ui;
    HSGLWidget *_glwidget;
};

我的 qtapplication.cpp 文件:

#include "qtapplication.h"

QtApplication::QtApplication(QWidget *parent)
    : QMainWindow(parent)
{
    ui.setupUi(this);
    this->_glwidget = NULL;

    if (this->_glwidget == NULL)
        this->_glwidget = new HSGLWidget();
    this->_glwidget->setVisible(true);
    setCentralWidget(this->_glwidget);
}

QtApplication::~QtApplication()
{

}

我的 HSGLWidjet.h 文件:

#include <QGLWidget>

class HSGLWidget : public QGLWidget {

    Q_OBJECT
    public:
        explicit HSGLWidget(QWidget *parent = 0);
        virtual ~HSGLWidget();

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

        virtual void keyPressEvent(QKeyEvent *keyEvent);

    private:
        void _onSetup();

    private:
        QTimer  *_timer;
};

还有我的 HSGLWidjet.cpp 文件:

#include <iostream>
#include "HSGLWidget.hpp"

float toto_angle = 0.0f;

HSGLWidget::HSGLWidget(QWidget *parent) 
    :  QGLWidget(parent)
{
    this->_onSetup();
}

HSGLWidget::~HSGLWidget(void)
{

}

void HSGLWidget::initializeGL()
{   
    glShadeModel(GL_SMOOTH);
    glClearColor(0.0f, 0.20f, 0.0f, 0.0f);
    glClearDepth(1.0f);
    glEnable(GL_DEPTH_TEST);
    glDepthFunc(GL_LEQUAL);
    glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST);
}

void HSGLWidget::resizeGL(int width, int height)
{
    if (height == 0)
        height = 1;
    glViewport(0, 0, width, height);
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    gluPerspective(45.0f, (GLfloat)width / (GLfloat)height, 0.1f, 100.0f);
    glMatrixMode(GL_MODELVIEW);
    glLoadIdentity();
}

void HSGLWidget::paintGL(void)
{
    std::cout << "PAINTGL" << std::endl;

    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    glLoadIdentity();
    glTranslatef(-1.5f, 0.0f, -6.0f);

    glEnable(GL_MODELVIEW);

    glPushMatrix();

    glTranslatef(0.0f, 0.0f, 0.0f);
    glRotatef(toto_angle, 1.0f, 1.0f, 1.0f);
    glScalef(1.0f, 1.0f, 1.0f);

    glBegin(GL_TRIANGLES);
    glColor3ub(255, 0, 0);
    glVertex3f(0.0f, 0.75f, 0.0f);
    glColor3ub(0, 255, 0);
    glVertex3f(-0.75f, 0.0f, 0.0f);
    glColor3ub(0, 0, 255);
    glVertex3f(0.75f, 0.0f, 0.0f);
    glEnd();

    toto_angle+=1.0f;
    glPopMatrix();
}

void HSGLWidget::keyPressEvent(QKeyEvent *keyEvent)
{

}

void HSGLWidget::_onSetup()
{

}

字符串 'PAINTGL' 仅针对第一帧写入。通常,paintGL 会被自动调用。在这种情况面前,我真的很迷茫。有人可以帮助我吗?非常感谢您的帮助。

4

1 回答 1

3

完全没有问题,这是标准行为。

您会看到,paint()并且paintGL()仅在需要绘制窗口时才调用。那就是:当你的应用程序被创建时,当窗口被调整大小或移动时。只有这样paintGL()才会触发。而已!

如果您希望它被多次调用,您将需要添加一个计时器来执行update(),这是一种强制重绘窗口的方法,这反过来又会触发paintGL()不要paintGL()直接打电话!

QTimer可以帮助您实现您的目标!

于 2013-07-25T19:44:39.353 回答