2013-08-07 4 views
0

keypress-event를 사용하여 paintGL 메서드를 제어하려고합니다. 목표는 복귀를 밀어서 추가 지점을 보여주는 것입니다. 다른 말로하면 : 멋진 배경 장면을 그렸습니다. 이제는 선 편집에서 반환을 푸시하고 이미 표시된 배경 앞에 빨간색 점이 나타납니다.paintGL 메서드 제어 - 페인트 할 대상을 결정하는 방법?

//MainWindow.cpp

MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), ui(new Ui::MainWindow) 
{ 
    ui->setupUi(this); 
    glWidget = new GLWidget; 
    connect(ui->lineEdit, SIGNAL(returnPressed()), glWidget, SLOT (set_draw())); 
} 

//glwidget.h

#ifndef GLWIDGET_H 
#define GLWIDGET_H 

#include <QGLWidget> 
#include <QMessageBox> 
#include "mainwindow.h" 
#include "cstdio" 

class MainWindow; 

class GLWidget : public QGLWidget 
{ 
Q_OBJECT 
MainWindow *myMainWindow; 

public: 
    GLWidget(QWidget *parent = 0); 
    //~GLWidget; 

    int draw; 

    void initializeGL(); 
    void paintGL(); 
    void resizeGL(int w, int h); 

public slots: 
    void set_draw(); 
}; 
#endif // GLWIDGET_H 

//glwidget.cpp

GLWidget::GLWidget(QWidget *parent) : QGLWidget(parent) 
{ 
    draw = 0; 
} 
//------------- 
void GLWidget::set_draw() //this SLOT is activated by pushing return 
{ 
draw = 1; 
updateGL(); //updating paintGL... 
} 
//------------- 
void GLWidget::paintGL() 
{ 
    swapBuffers(); 
    glClear(GL_COLOR_BUFFER_BIT); 

/* drawing a lot of stuff*/ 

    if(draw == 1) 
    { 
/*the following messagebox is shown at the screen*/ 
QMessageBox* Box = new QMessageBox(); 
Box->setText("Bert"); 
Box->show(); 

/*this big red point is NOT shown at the screen*/ 
     glPointSize(30); 
     glBegin(GL_POINTS); 
      glColor3f(1.0, 0.0, 0.0); 
      glVertex3f(45,45,0); 
     glEnd(); 
    } 

} 
이 왜 작동하지

누군가가 설명 할 수 ? 빨간색 점이 나타나지 않습니다 ... int draw 값이 paintGL 메서드의 영향을 받습니까?

+0

디버그 할 때 실제로 'draw == 1'조건부로 들어가는가? 또한 뷰포트 크기가 화면 경계 내에서 45, 45 위치를 차지하고 있습니까? – Lochemage

+0

예, 그리기 == 1 조건으로 들어가지만 immediatly 0으로 되돌아갑니다. 그래서 저는 생각합니다. 요점은 몇 밀리 초 동안 "보여졌습니다". 그러나 나는 확실하지 않습니다 ... 뷰포트는 괜찮습니다. if-condition 외부에는 해당 지점이 표시됩니다. – edcrfv45

+0

변수 이름을 변경하려고합니다. 0으로 돌아 가면 한 프레임 만 그려집니다. – Lochemage

답변

1

OpenGL에서는 항상 전체 장면을 다시 그립니다. 추가 지점을 배열에 저장하십시오. 드로잉 할 때 해당 배열을 반복하고 배열의 내용에 따라 점을 그립니다.

+0

배열 (100,100,0)을 set_draw-method에 정의하고 다음과 같이 paintGL을 변경했습니다. void GLWidget :: paintGL() { swapBuffers(); glClear (GL_COLOR_BUFFER_BIT); glPointSize (3); glBegin (GL_POINTS); glVertex3f (point_array [0], point_array [1], point_array [2]); glEnd(); }이 점은 (0,0,0)에 이릅니다. 이는 이전에 "그리기"변수와 같이 배열이 0으로 설정되었음을 의미합니다 ... – edcrfv45

+0

@ edcrfv45 :이 경우 단일 변수가 충분할 것입니다. 나는 하나의 배열이 아닌 여러 개의 배열을 추가 할 수 있도록 배열을 제안했습니다. – datenwolf