2013-07-25 39 views
2

我使用QGLWidget编写了一个小型的QT程序。目标是在永久旋转中显示一个简单的三角形。问题是没有动画,因为只是第一帧被渲染。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。在这种情况下,我真的迷失了。有人可以帮我吗?提前感谢您的帮助。

回答

3

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

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

如果你希望它被调用一次以上,你将需要添加一个计时器执行update(),这是迫使窗口是重绘,这反过来又触发paintGL()的方法。 请勿直接拨打paintGL()

QTimer可以帮助您实现您正在寻找的东西!

+0

你可以请看看我的问题:(http://stackoverflow.com/questions/18391673/getting-error-using-svm-with-surf) – Rocket