2012-01-19 4 views
0

私は、デバッガをステップ実行すると、私は以下のポップアップメッセージが出ます:Qtアプリケーションは、GLWidget.show()でセグメンテーションフォルトを発生させます。

The inferior stopped because it received a signal from the Operating System. 

Signal name : 
SIGSEGV 
Signal meaning : 
Segmentation fault 

コードのこれらの行に(と思う)依存している:私の知る限りでは

#ifndef Q_WS_WINCE 
    inline void show() { setVisible(true); } 
#else 
    void show(); 
#endif 
    inline void hide() { setVisible(false); } 
    inline QT_MOC_COMPAT void setShown(bool shown) { setVisible(shown); } 

を、Q_WS_WINCEは定義されていませんが、私はGoogleを介してそれの背後にある定義を見つけることができませんでした。 thisは私が見つけた最も近いものですが、CEという定義はありません。

inline void show() { setVisible(true); }関数の呼び出しで、矢印が#ifndef Q_WS_WINCEに従うので、私のデバッガによれば、これが呼び出されます。

私はこのことがどのように起こっているのかについて迷っています。ここで何が起きてるの?私はIDEとしてQt Creatorと共にUbuntu 11.10を使用しています。私はこのことが数分前に起き始めたことにも気づくべきです。私は何の問題もなく前に私のコードの大部分を踏みとどめることができました。

GLWidgetヘッダーは

#pragma once 

#include <QGLWidget> 
#include <QInputEvent> 
#include "Cube.h" 

class GLWidget : public QGLWidget 
{ 
    Q_OBJECT 

public: 
    explicit GLWidget(QWidget *parent = 0); 

    ~GLWidget(void); 

    QSize minimumSizeHint(void) const; 

    QSize sizeHint(void) const; 

public slots: 
    void SetXRotation(int angle); 

    void SetYRotation(int angle); 

    void SetZRotation(int angle); 

signals: 
    void xRotationChanged(int angle); 

    void yRotationChanged(int angle); 

    void zRotationChanged(int angle); 

protected: 
    void initializeGL(void); 

    void paintGL(void); 

    void resizeGL(int width, int height); 

    void mousePressEvent(QMouseEvent *event); 

    void mouseMoveEvent(QMouseEvent *event); 

private: 
    Cube *mCube; 

    int mXRot; 

    int mYRot; 

    int mZRot; 

    QPoint mLastPos; 

    QColor mQtGreen; 

    QColor mQtPurple; 

}; 

GLWidgetソースが

#include <GL/freeglut.h> 

#include <QtGui> 
#include <QtOpenGL> 

#include <qmath.h> 
#include <QMatrix4x4> 

#include "GLWidget.h" 

#ifndef GL_MULTISAMPLE 
#define GL_MULTISAMPLE 0x809D 
#endif 

static void qNormalizeAngle(int &angle) 
{ 
    const int ANGLE_MULTIPLIER = 360 * 16; 

    while(angle < 0) 
     angle += ANGLE_MULTIPLIER; 
    while (angle > ANGLE_MULTIPLIER) 
     angle -= ANGLE_MULTIPLIER; 
} 

GLWidget::GLWidget(QWidget *parent) : 
    QGLWidget(parent), 
    mXRot(0), 
    mYRot(0), 
    mZRot(0) 
{  
} 

GLWidget::~GLWidget(void) 
{ 
    delete mCube; 
} 

void GLWidget::initializeGL(void) 
{ 
    mQtGreen = QColor::fromCmyk(0.40, 0.0, 1.0, 0.0); 
    mQtPurple = QColor::fromCmyk(0.39, 0.39, 0.0, 0.0); 

    //glutInitDisplayMode(GLUT_RGBA | GLUT_DEPTH); 

    qglClearColor(mQtPurple); 

    mCube = new Cube(this); 
    mCube->Init(); 
    mCube->SetColor(mQtGreen.dark()); 

    glEnable(GL_DEPTH_TEST); 
    glEnable(GL_CULL_FACE); 
    glShadeModel(GL_SMOOTH); 
    glEnable(GL_LIGHTING); 
    glEnable(GL_LIGHT0); 
    glEnable(GL_MULTISAMPLE); 
    static GLfloat lightPosition[4] = { 0.5, 5.0, 7.0, 1.0 }; 
    glLightfv(GL_LIGHT0, GL_POSITION, lightPosition); 
} 

QSize GLWidget::minimumSizeHint(void) const 
{ 
    return QSize(50, 50); 
} 

void GLWidget::mouseMoveEvent(QMouseEvent *event) 
{ 
    mLastPos = event->pos(); 
} 

void GLWidget::mousePressEvent(QMouseEvent *event) 
{ 
    static const int ANGLE_ADDIFIER = 8; 

    int dx = event->x() - mLastPos.x(); 
    int dy = event->y() - mLastPos.y(); 

    if (event->buttons() & Qt::LeftButton) 
    { 
     SetXRotation((mXRot + ANGLE_ADDIFIER) * dy); 
     SetYRotation((mYRot + ANGLE_ADDIFIER) * dx); 

     qDebug() << "You pressed the left mouse button!" << '\n'; 
    } 
    else if (event->buttons() & Qt::RightButton) 
    { 
     SetXRotation((mXRot + ANGLE_ADDIFIER) * dy); 
     SetZRotation((mZRot + ANGLE_ADDIFIER) * dx); 

     qDebug() << "You pressed the right mouse button!" << '\n'; 
    } 

    mLastPos = event->pos(); 
} 

void GLWidget::paintGL(void) 
{ 
    static const GLfloat ANGLE_DIVISOR = 16.0; 

    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); 
    glLoadIdentity(); 
    glTranslatef(0.0, 0.0, -10.0); 

    glRotatef(mXRot/ANGLE_DIVISOR, 1.0, 0.0, 0.0); 
    glRotatef(mYRot/ANGLE_DIVISOR, 0.0, 1.0, 0.0); 
    glRotatef(mZRot/ANGLE_DIVISOR, 0.0, 0.0, 1.0); 

    mCube->Draw(); 
} 

void GLWidget::resizeGL(int width, int height) 
{ 
    int side = qMin(width, height); 

    //glutInitWindowPosition(0, 0); 
    //glutInitWindowSize(width, height); 

    glViewport((width - side)/VIEWPORT_DIVISOR, (height - side)/VIEWPORT_DIVISOR, side, side); 
    glMatrixMode(GL_PROJECTION); 
    glLoadIdentity(); 

#ifdef QT_OPENGL_ES_1 
    glOrthof(-0.5, +0.5, -0.5, +0.5, 4.0, 15.0); 
#else 
    glOrtho(-0.5, +0.5, -0.5, +0.5, 4.0, 15.0); 
#endif*/ 

    glMatrixMode(GL_MODELVIEW); 
} 

void GLWidget::SetXRotation(int angle) 
{ 
    qNormalizeAngle(angle); 

    if (angle != mYRot) 
    { 
     mYRot = angle; 
     emit yRotationChanged(angle); 
     updateGL(); 
    } 
} 

void GLWidget::SetYRotation(int angle) 
{ 
    qNormalizeAngle(angle); 

    if (angle != mXRot) 
    { 
     mXRot = angle; 
     emit xRotationChanged(angle); 
     updateGL(); 
    } 
} 

void GLWidget::SetZRotation(int angle) 
{ 
    qNormalizeAngle(angle); 

    if (angle != mZRot) 
    { 
     mZRot = angle; 
     emit zRotationChanged(angle); 
     updateGL(); 
    } 
} 

QSize GLWidget::sizeHint() const 
{ 
    return QSize(400, 400); 
} 
+0

アプリケーションのセグメンテーション時のコールスタックとは何ですか? –

答えて

0

が犯人を見つかったファイルファイル:私は、コードのどこかに置き忘れたmCube->Init();関数呼び出しを持っていました。これは今解決されると考えられるべきです。

関連する問題