2013-07-25 46 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