2011-05-13 42 views
0

我正在開發一個Symbian應用程序。 我已經寫了一個系統,用於容易地改變視圖,大致是這樣的:自定義的Symbian視圖系統,在未知位置的分段錯誤,未知原因

class ViewManager : public QWidget { 
    public slots: 
     void changeView(const QString &id) { 
     if(currentView_m) { 
      delete currentView_m; 
      currentView_m = 0; 
     } 

     if(id == "main") { 
      currentView = new MainView(this); 
     } 
     else if(...) { 
      //etc.. 

     layout_m->addWidget(currentView_m); 
     connect(currentView_m, SIGNAL(changeView(QString)), 
        this, SLOT(changeView(QString))); 
     } 
    private: 
     View *currentView_m; 
}; 

class View : public QWidget { 
    signals: 
     void ChangeView(const QString &id); 
}; 

class MainView : public View { 
    public slots: 
     void onButtonClicked() { 
     emit changeView("someview"); 
     } 
}; 

然後作爲一個例子,我使用ViewManager在主:

int main(int argc, char *argv[]) { 
    QApp app... 

    ViewManager man; 
    man.changeView("main"); 

    app.exec(); 
} 

當我改變視圖的第一次,它工作得很好,然後當我再次更改視圖時,它會發生段錯誤!當我刪除currentView_m指針時,你可能會認爲它是段錯誤,但不是!程序退出changeView-slot後,會發生分段錯誤。

我不知道如何調試,因爲程序崩潰並顯示反彙編轉儲,堆棧跟蹤只顯示亂碼。

難道是在槽調用之後,程序進入QApplication事件循環並在那裏崩潰?我在View實現中使用了一個自定義的小部件,它覆蓋了一些受保護的QWidget事件。

回答

1

您正在刪除正在處理的信號的對象。而不是delete,只需在對象上調用deleteLater(),將刪除推遲到「安全」點。

+0

調用deleteLater()而不是delete解決了崩潰問題,但是我現在在爲currentView_m設置焦點時遇到了問題,我必須先按widget/view。調用setFocus()並沒有解決問題。任何想法? – Gerstmann 2011-05-13 11:23:47

0

嘗試先從佈局中移除視圖。然後刪除視圖。您可以使用removeWidget,removeItem方法爲此目的佈局

佈局可能試圖訪問刪除視圖。

請閱讀Qt - remove all widgets from layout?這個問題。它可能會給你洞察力。