私は、デバッガをステップ実行すると、私は以下のポップアップメッセージが出ます: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);
}
アプリケーションのセグメンテーション時のコールスタックとは何ですか? –