Qt App 在 GLWidget.show() 上导致分段错误;

Posted

技术标签:

【中文标题】Qt App 在 GLWidget.show() 上导致分段错误;【英文标题】:Qt App causes Segmentation Fault upon GLWidget.show(); 【发布时间】:2012-01-19 22:21:43 【问题描述】:

当我单步调试调试器时,我收到以下弹出消息:

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

我不知道这是怎么发生的;这里发生了什么?我正在使用 Ubuntu 11.10,以及 Qt Creator 作为我的 IDE。我还应该注意到,这只是几分钟前才开始发生的;我之前能够单步执行我的大部分代码,没有任何问题。

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 );

【问题讨论】:

应用程序段错误时的调用堆栈是什么? 【参考方案1】:

找到了罪魁祸首:我有一个mCube-&gt;Init(); 函数调用,它在代码中的某个地方放错了位置。现在应该认为这已经解决了。

【讨论】:

以上是关于Qt App 在 GLWidget.show() 上导致分段错误;的主要内容,如果未能解决你的问题,请参考以下文章

如何在单个 App 中混合 Qt 和原生 iOS 用户界面元素?

在 Cocoa App 的 QT 电影之间创建白色淡入淡出

在 Qt Creator App 中包含 Web 查看器

确定 Qt App 是不是有 UI

qt串口静态搭建,qt app部署到所有linux系统

Qt - 包 android.support.v4.app 不存在