Qt просто нарисуйте первый кадр, используя QGLWidget из QT

Я написал небольшую программу QT, используя QGLWidget. Цель состоит в том, чтобы отобразить простой треугольник в постоянном вращении. Проблема в том, что анимации нет, потому что отображается только первый кадр.

Вот мой основной исходный код на 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 вызывается автоматически. Я действительно потерян перед этой ситуацией. Кто-нибудь может мне помочь, пожалуйста? Заранее большое спасибо за вашу помощь.

1 ответ

Решение

Там нет никаких проблем, это стандартное поведение.

Ты видишь, paint() а также paintGL() Вызываются только тогда, когда нужно нарисовать окно. То есть: когда ваше приложение создается, когда окно изменяется или перемещается. Только затем paintGL() срабатывает. Это оно!

Если вы хотите, чтобы он вызывался более одного раза, вам нужно добавить таймер для выполнения update(), который является методом, который заставляет окно перерисовываться, что в свою очередь вызывает paintGL(), Не звони paintGL() напрямую!

QTimer может помочь вам достичь того, что вы ищете!

Другие вопросы по тегам