【问题标题】:Custom Symbian view system, segmentation fault at an unknown location, unknown cause自定义 Symbian 视图系统,未知位置的分段错误,未知原因
【发布时间】:2011-05-13 05:47:16
【问题描述】:

我正在开发一个 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 后,立即发生分段错误。

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

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

【问题讨论】:

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


    【解决方案1】:

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

    【讨论】:

    • 调用 deleteLater() 而不是 delete 解决了崩溃,但我现在无法为 currentView_m 设置焦点,我必须先按下小部件/视图。调用 setFocus() 并没有解决问题。有什么想法吗?
    【解决方案2】:

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

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

    也请阅读这个Qt - remove all widgets from layout? 问题。它可能会给您带来洞察力。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-11-04
      • 2017-08-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多