2014-12-19 68 views
-3

我trting打開一個新的窗口(窗口與qt3d應用cubeview視圖),只要在用戶點擊主窗口上的按鈕。Class對象Qt中

#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 

和主窗口.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類對象,以便稍後使用它。 我可以將它初始化爲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 2014-12-19 08:01:20

+0

在MainWindow構造函數中初始化'CubeView'有什麼問題?另一方面,你應該指定你想要的'CubeView'的生命期。它決定你應該在哪裏初始化它。 – Tay2510 2014-12-19 08:03:47

+2

如果你沒有初始化'view'指針,它將有一個不確定的值,並以任何方式訪問它,除了初始化它將導致[* undefined behavior *](http://en.wikipedia.org/wiki/ Undefined_behavior)(這可能是崩潰的最常見原因)。 – 2014-12-19 08:06:41

回答

0

我想我終於找到了我的答案。它與cubeview類構造函數的定義沒有任何關係。簡單的原理是,我們不需要在循環中創建類對象或程序代碼崩潰。 - >如果直接放入連接插槽,view.show也會遇到無限循環的錯誤。 這是答案。

#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; 
 
}

這樣,如果該值已經NULL創建新的對象窗口。