自定义Symbian视图系统,在未知位置进行分段故障,原因不明

时间:2011-05-13 05:47:16

标签: qt views segmentation-fault symbian signals-slots

我正在开发一个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" );
      } 
};

然后作为一个例子,我在main中使用ViewManager:

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

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

   app.exec();
}

当我第一次更改视图时,它工作正常,然后当我再次更改视图时,它会出现段错误!当我删除currentView_m指针时你可能会认为它是段错误的,但是没有!程序退出changeView-slot后立即发生分段错误。

我不知道如何调试它,因为程序崩溃并显示反汇编转储,堆栈跟踪只显示乱码。

可能是在插槽调用之后,程序进入QApplication事件循环并在那里崩溃?我在View实现中使用了一个自定义小部件,它覆盖了一些受保护的QWidget事件。

2 个答案:

答案 0 :(得分:1)

您正在删除正在处理的信号的对象。而不是delete,只需在对象上调用deleteLater(),将删除推迟到“安全”点。

答案 1 :(得分:0)

首先尝试从布局中删除视图。然后删除视图。您可以为此目的使用removeWidget,removeItem布局方法

布局可能正在尝试访问删除视图。

同时阅读此Qt - remove all widgets from layout?问题。它可能会给你见解。