2013-07-25 3 views
2

Я закодировал небольшую программу QT с помощью QGLWidget. Цель состоит в том, чтобы отобразить простой треугольник в постоянном вращении. Проблема в том, что анимации нет, потому что визуализируется только первый кадр.Qt просто рисует первый кадр с помощью 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 вызывается автоматически. Я действительно потерялся перед этой ситуацией. Кто-нибудь может мне помочь, пожалуйста? Большое спасибо за вашу помощь.

ответ

3

Нет проблем вообще, это стандартное поведение.

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

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

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

+0

Не могли бы вы взглянуть на мой вопрос: (http://stackoverflow.com/questions/18391673/getting-error-using-svm-with-surf) – Rocket

Смежные вопросы