0

Qt と OpenGL を使用して、非常に単純なアプリケーションを開発しています。アプリケーションには、対話用のいくつかのボタンと、3 つのページを含むウィジェット タブが含まれています。最初の 2 つはデータを分析および処理するためのもので、3 つ目はGLWidget3D 空間に結果ポイントを描画するためのものです。

最初は、3D 空間には点が含まれていません。すべてのデータが処理された後、3 つの点が描画されます。

これまでのところ、外部関数を呼び出してpaintGL()、シーンの中心に立体立方体を描画しようとしました。メソッドは正しく呼び出されますが、ウィジェットにはキューブが表示されません。

のコードは次のglwidget.cppとおりです。

GLWidget::GLWidget(QWidget *parent) :
    QGLWidget(parent)
{
    connect(&timer, SIGNAL(timeout()), this, SLOT(updateGL()));
    timer.start(1000);
}

void GLWidget::initializeGL(int w, int h) {
    glClearColor(0.2f, 0.2f, 0.2f, 1);
    glViewport(0, 0, w, h);
    // Setup light
    const GLfloat light_ambient[] = { 0.0f, 0.0f, 0.0f, 1.0f };
    const GLfloat light_diffuse[] = { 1.0f, 1.0f, 1.0f, 1.0f };
    const GLfloat light_specular[] = { 1.0f, 1.0f, 1.0f, 1.0f };
    const GLfloat light_position[] = {2.0f, 5.0f, 5.0f, 0.0f };
    glEnable(GL_DEPTH_TEST);
    glEnable(GL_CULL_FACE);
    glEnable(GL_DOUBLE);
    glShadeModel(GL_SMOOTH);
    glClearColor(0.0f, 0.0f, 0.0f, 0.0f);
    glEnable(GL_DEPTH_TEST);
    glEnable(GL_LIGHT0);
    glEnable(GL_LIGHTING);
    glEnable(GL_COLOR_MATERIAL);
    glLightfv(GL_LIGHT0, GL_AMBIENT, light_ambient);
    glLightfv(GL_LIGHT0, GL_DIFFUSE, light_diffuse);
    glLightfv(GL_LIGHT0, GL_SPECULAR, light_specular);
    glLightfv(GL_LIGHT0, GL_POSITION, light_position);
    glEnable(GL_CULL_FACE);
    glCullFace(GL_BACK);
    glDepthFunc(GL_LESS);
    glEnable(GL_COLOR_MATERIAL);
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    gluPerspective(60.0, 1.0, 0.0001, 1000.0);
    glMatrixMode(GL_MODELVIEW);
    current_view= TOP_VIEW;

}

// Display
void GLWidget::paintGL() {
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    glEnable(GL_DEPTH_TEST);
    glLoadIdentity();
    setView();
    if (current_view == EXPLORING_VIEW)
        calculate_lookpoint();
    gluLookAt(eyex, eyey, eyez, centerx, centery, centerz, upx, upy, upz);
    // Draw axis and add points
    drawAxis();
    int ind;
    Skyline s;
    if (s.skylineGenerated()) {
        drawCube();
        cout << "Generated" << endl;
    }
   swapBuffers();
}

void GLWidget::drawCube(void){
    cout << "Drawn\n";
    glTranslatef(0.0,0.0,0.0);
    glColor3f(1.0,0.0,0.0);
    glutSolidCube(2.0);
    update();
}

// Reshape
void GLWidget::resizeGL(int w, int h) {
    glViewport(0, 0, (GLsizei) w, (GLsizei) h);
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    gluPerspective (48.0, (GLfloat) w/(GLfloat) h, 10.0, 800.0);
    glMatrixMode (GL_MODELVIEW);
}
4

1 に答える 1

1
  1. initializeGL の前に paintGL 関数を呼び出したくないので、タイマー初期化コードを initializeGL 関数の最後に配置します。(現在のコードを使用すると発生する可能性があります)

  2. タイマー スロットをQGLWidget::updateの代わりに に接続しますQGLWidget::updateGL。これにより、必要になるだけでなくupdateGL、キューに入れられたペイント イベントを 1 つのイベントにまとめることができます。

  3. timer.singleShot() が true を返さないことを確認してください。そうすると、ウィジェットは 1 回だけ更新されます。

  4. initializeGL は引数を取らないでください。Qtは引数なしでinitializeGL関数を呼び出そうとしているため、initializeGL関数を呼び出すことはなく、QGLWidget::initializeGL代わりに基本クラスを呼び出します。また、静的なビューポートを使用するべきではなく、オーバーライドされた 内ですべてのビューポートのサイズ変更 (glViewport) を処理する必要がありますQGLWidget::resizeGL( int w, int h )

于 2013-03-19T17:25:00.580 に答える