1

Qt4 を使用して OpenGL で単純な三角形を作成していますが、set format を使用してマルチサンプリングを有効にするまでは正常に動作します。これが私のコードです:

#include <QApplication>
#include <QtOpenGL>
// gl window class
class GLWindow : public QGLWidget
{
public:
    GLWindow(QWidget *parent = nullptr)
        : QGLWidget(parent){}
protected:
    // ALL THE FOLLOWING FUNCTIONS ARE OVERRIDDEN FROM QGLWIDGET 
    void initializeGL()
    {
        QGLFormat newFormat = this->format();
        newFormat.setSampleBuffers(true);
        newFormat.setSamples(16);
        this->setFormat(newFormat);
    }
    void resizeGL(int w, int h)
    {
        glViewport(0, 0, w, h);
        glMatrixMode(GL_PROJECTION);
        glLoadIdentity();
        glOrtho(-1, 1, -1, 1, -1, 1);
        glMatrixMode(GL_MODELVIEW);
        glLoadIdentity();
    }
    void paintGL()
    {
        glClear(GL_COLOR_BUFFER_BIT);
        glBegin(GL_TRIANGLES);
            glColor3f(1, 0, 0);
            glVertex2f(0, 1);
            glColor3f(0, 1, 0);
            glVertex2f(1, -1);
            glColor3f(0, 0, 1);
            glVertex2f(-1, -1);
        glEnd();
    }
};
// main function
int main(int argc, char **argv)
{
    QApplication app(argc, argv);
    GLWindow window;
    window.resize(640, 480);
    window.show();
    return app.exec();
}

「initlializeGL」にフォーマットを追加する前は、正常に機能していました(マルチサンプリングがないことを除いて)。

次に、フォーマットを追加すると、ウィンドウが閉じません。そして、これを言うとき、右上隅の「X」ボタンを押しても閉じないか、ウィンドウの「close()」関数を呼び出しても閉じないことを意味します。

さらに、「X」ボタンを押すと「closeEvent()」を呼び出しますが(確認しました)、実際には何も閉じません。オーバーライドされた「closeEvent()」関数内で「close()」を呼び出してみましたが、何もしませんでした。

もう一度、「initializeGL()」のコードを削除すると、問題なく終了します。そこで、「initializeGL()」にあるコードをコンストラクターに移動しようとします。マルチサンプリングが機能し、「X」を押すと閉じます。すごい!ウィンドウが閉じた後にこれを取得することを除いて:

ここに画像の説明を入力

それで、それはそれです。手短に:

  • 「initializeGL()」に「setFormat()」関連のコードがない場合、すべて正常に動作します。
  • 「setFormat()」関連のコードを「initializeGL()」に入れると、ウィンドウが閉じません。
  • 「setFormat()」関連のコードをコンストラクターに入れると、ウィンドウが閉じられたときに上の画像に示されている奇妙なエラーが発生します。

では、マルチサンプリングを有効にしたまま、ウィンドウを閉じた後にダムエラーが発生することなく、ウィンドウを閉じるにはどうすればよいですか?

編集:これが私の.proファイルのテキストです

QT += core
QT += gui
QT += opengl

SOURCES += \
    main.cpp
4

1 に答える 1

3

setFormatから呼び出すべきではありません。それ自体initializeGLへの呼び出しをトリガーするからinitializeGLです。また、 Qt 4.8QGLWidget::setFormatでは廃止されているため、まったく使用しないでください。

したがって、最初setFormatにコンストラクターから呼び出してみてください。次に、機能しない場合(または機能する場合でも)、QGLWidgetfromのコンストラクターに形式を渡してみてくださいmain()

于 2012-12-05T00:40:03.477 に答える