2011-05-13 55 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?这个问题。它可能会给你洞察力。