2013-03-03 63 views
0

應用我書面方式有些類具有可訪問容易的獨特實例。爲此我使用單身。SIGSEGV與QMainWindow的單

對於爲例我的核心定義爲:

class Core : public QObject 
{ 
     Q_OBJECT 
    public: 
     Core(); 
     ~Core(); 
     static Core& getCore() 
     { 
      static Core mycore; 
      return mycore; 
     } 
     (...) 
}; 

,它工作得很好。然而,我試圖對我的MainWindow類做同樣的處理,它從QMainWindow中插入。我需要的是,爲了訪問方法,比如幾何()與其他對象

但是核心的偉大工程,主窗口clossing的PROGRAME時使錯誤。主窗口析構函數被調用並顯然執行過一次(使用qDebug()進行調試),但我仍然有一個SIGSEGV信號。發生了什麼?如何解決它?

這裏是主窗口

class MainWindow : public QMainWindow 
{ 
     Q_OBJECT 
    public: 
     MainWindow(QWidget *parent = 0); 
     ~MainWindow(); 
     static MainWindow& getUi() 
     { 
      static MainWindow myUi; 
      return myUi; 
     } 
    public slots: 
     void refreshImage(); 
    private: 
     Ui::MainWindow *ui; 
}; 
MainWindow::MainWindow(QWidget *parent) : 
    QMainWindow(parent), 
    ui(new Ui::MainWindow) 
{ 
    ui->setupUi(this); 
    connect(&appCore(), SIGNAL(refreshed()), this, SLOT(refreshImage())); 
} 
MainWindow::~MainWindow() 
{ 
    delete ui; 
} 

代碼和主代碼

QApplication app(argc, argv); 
try 
{ 
    appCore().setDevice(MDMA::Kinect); 
    appUi().show(); 
    return app.exec(); 
} catch(MDMA::exn e) { 
    (...) 
} 

其中appCore和AppUi裏是核心:: getCore和主窗口::的getUI()

+0

「和它的作品好了」沒有沒有。停止使用單身人士;他們毫無價值。 – 2013-03-03 15:00:24

+0

你怎麼辦呢? – Amxx 2013-03-03 15:24:09

回答

1

宏這個崩潰可能是由於您的QApplicationMainWindow之前被銷燬造成的。

如果無法通過其他途徑需要它的代碼通過您的MainWindow(例如,作爲參數或通過QObjecg::parent()),你可以採用類似於QApplication做了技術與它的instance方法(非擁有全球參考):

構建堆棧上的MainWindow作爲一個普通的局部變量,QApplication後。然後設置一個全球性的指針(也許更好QPointer;的MainWindow例如靜態成員),它最初初始化爲0,以thisMainWindow構造。你也可以檢查它是否已經在這裏初始化以強制唯一性。通過公共訪問方法(instance?)全球指針,可以同時QApplication前確保銷燬從任何地方訪問類。