2014-12-19 2 views
-3

메인 윈도우에서 버튼을 클릭 할 때마다 새로운 윈도우 (qt3d 어플리케이션에서 큐브 뷰가있는 윈도우)를 열어 트립하고 있습니다.Qt의 mainwindow.h에있는 클래스 객체

#ifndef MAINWINDOW_H 
#define MAINWINDOW_H 

#include <QMainWindow> 
#include "cubeview.h" 

namespace Ui { 
class MainWindow; 
} 

class MainWindow : public QMainWindow 
{ 
    Q_OBJECT 

public: 
    explicit MainWindow(QWidget *parent = 0); 
    ~MainWindow(); 
    int getid(); 

public slots: 
    void pattern1(); 

private: 
    CubeView *view; 
    Ui::MainWindow *ui; 
}; 

#endif // MAINWINDOW_H 

및 MainWindow를의 .CPP 파일

#include "mainwindow.h" 
#include "ui_mainwindow.h" 
#include <QPushButton> 
#include <iostream> 
#include "cubeview.h" 

int pattern_id; 
MainWindow::MainWindow(QWidget *parent) : 
    QMainWindow(parent), 
    ui(new Ui::MainWindow) 
{ 
    ui->setupUi(this); 
    QPushButton *button= new QPushButton("Pattern 1"); 
    QObject::connect(button, SIGNAL(clicked()), this, SLOT(pattern1())); 
    button->show(); 
    std::cout<<"reached mainwindow constructor"<<std::endl; 
    //view= new CubeView; 

} 
void MainWindow::pattern1() 
{ 
    pattern_id=1; 
    view->begin(1); 
    view->resize(800, 600); 
    view->show(); 
    std::cout<<pattern_id<<std::endl; 
} 
int MainWindow::getid() 
{ 
    return pattern_id; 
} 
MainWindow::~MainWindow() 
{ 
    delete ui; 
    delete view; 
} 

나는 런타임 오류가 발생합니다.

내가 무엇을 하려는지 알기를 바랍니다. 누름 단추를 클릭 할 때마다 큐브 뷰 뷰 창이 표시됩니다. 내가 뭘 만들고있는 실수 야? cubeView 클래스 오브젝트를 어디에 정의해야 나중에 사용할 수 있습니까? CubeView * view = new CubeView로 초기화 할 수 있습니까? 헤더 파일에. mainwindow.cpp의 생성자로 작성하려고 시도했지만 하지만 런타임 오류가 발생합니다.

#ifndef CUBEVIEW_H 
#define CUBEVIEW_H 

#include "qglview.h" 
#include "qgltexture2d.h" 

QT_BEGIN_NAMESPACE 
class QGLSceneNode; 
QT_END_NAMESPACE 

//! [1] 
class CubeView : public QGLView 
{ 
//! [1] 
    Q_OBJECT 

public: 
    CubeView(QWidget *parent = 0); 
    ~CubeView(); 
    void begin(int pattern_id); 

public slots: 
    void update_action(); 

protected: 
    void paintGL(QGLPainter *painter); 

    //! [2] 
private: 
    QGLSceneNode *cube; 
    QGLSceneNode *cursor; 
    QGLTexture2D logo; 
    QGLTexture2D* texture; 
    QGLTexture2D handcursor; 

}; 
//! [2] 

#endif 


//! [1] constructor, initialize the cube, cursor and camera 
CubeView::CubeView(QWidget *parent) 
{ 
    //! [1] draw the paintboard 
    QVector3D *cube1_pos= new QVector3D(0.0,0.0,-1.5); 
    QGLBuilder builder1; 
    builder1 << QGL::Faceted; 
    builder1 << QGLCube(3.25); 
    cube = builder1.finalizedSceneNode(); 
    cube->setPosition(*cube1_pos); 

    //draw the cursor 
    QGLBuilder cursor_builder; 
    cursor_builder <<QGL::Faceted; 
    cursor_builder <<QGLCube(0.15); 
    cursor=cursor_builder.finalizedSceneNode(); 

    //camera setup 
    camera()->setFieldOfView(35); 
    camera()->setNearPlane(1); 
    camera()->setFarPlane(15); 

    //! [2] set texture for cube and cursor 
    //QImage image(QLatin1String(":/bluecircle.jpg")); 

    handcursor.setImage(QImage(QLatin1String(":/hand.jpg"))); 
    std::cout<<"constructor called"<<std::endl; 


} 
+1

왜이 줄을 주석 처리합니까? '// view = new CubeView;'생성자에 메모리를 할당해야합니다. – Chernobyl

+0

'MainWindow' 생성자에서'CubeView'를 초기화하는 문제는 무엇입니까? 다른 한편으로는, 당신이 원하는'CubeView'의 수명을 지정해야합니다. 초기화 할 위치를 결정합니다. – Tay2510

+2

'view' 포인터를 초기화하지 않으면 불확정 값을 가지며 초기화하는 것 이외의 방법으로 액세스하면 [* 정의되지 않은 동작 *]이 발생합니다 (http://en.wikipedia.org/wiki/). Undefined_behavior) (아마도 가장 일반적인 충돌 원인). –

답변

0

나는 결국 내 대답을 찾았다 고 생각합니다. 그것은 cubeview 클래스 생성자의 정의와 관련이 없습니다. 간단한 원칙은 -> 루프 내에서 클래스 객체를 만들지 않아도되고 프로그램 코드가 충돌 할 수도 있습니다. -> view.show도 연결 슬롯에 직접 넣으면 무한 루프의 오류가 발생합니다. 답변입니다. 값이 이미 NULL 인 경우

#include "mainwindow.h" 
 
#include "ui_mainwindow.h" 
 
#include <QPushButton> 
 
#include <iostream> 
 
#include "cubeview.h" 
 

 

 
int pattern_id; 
 
MainWindow::MainWindow(QWidget *parent) : 
 
    QMainWindow(parent), 
 
    ui(new Ui::MainWindow) 
 
{ 
 
    ui->setupUi(this); 
 
    view=0; 
 

 
    std::cout<<"reached mainwindow constructor"<<std::endl; 
 
    QPushButton *button= new QPushButton("Pattern 1"); 
 
     QObject::connect(button, SIGNAL(clicked()), this, SLOT(pattern1())); 
 
     button->show(); 
 

 
    else if(view!=NULL) 
 
    { 
 
     std::cout<<"view is already initialized"<<std::endl; 
 
    } 
 

 

 
} 
 
void MainWindow::pattern1() 
 
{ 
 

 
    if(view==NULL) 
 
    { 
 
     view=new CubeView; 
 
     view->begin(1); 
 
     view->resize(800, 600); 
 
      view->show(); 
 

 
    } 
 
} 
 
int MainWindow::getid() 
 
{ 
 
    return pattern_id; 
 
} 
 
MainWindow::~MainWindow() 
 
{ 
 
    delete ui; 
 
     delete view; 
 
}
이런 식으로

는 새 개체 창이 생성됩니다.