2011-05-13 2 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(); 
} 

내가보기를 변경하는 경우 처음에는 괜찮 았는데, 다음번에 다시보기로 변경하면 segfaults! 내가 currentView_m 포인터를 지울 때 segfaults라고 생각할 수도 있지만, 그렇지 않습니다! 세그먼테이션 오류는 프로그램이 changeView-slot을 종료 한 직후에 발생합니다.

프로그램이 충돌하고 디스어셈블러 덤프를 표시하고 스택 추적이 단지 횡설수설을 보여주기 때문에이 디버깅 방법을 알지 못합니다.

슬롯 호출 후 프로그램이 QApplication 이벤트 루프로 이동하여 충돌 할 수 있습니까? 일부 QWidget 보호 된 이벤트를 재정의하는 View 구현 내에서 사용자 정의 위젯을 사용하고 있습니다.

답변

1

처리중인 신호가있는 대상을 삭제하고 있습니다. delete 대신 개체에 deleteLater()을 호출하고 삭제를 "안전한"지점으로 연기하십시오.

+0

삭제 대신 deleteLater()를 호출하면 충돌이 해결되지만 현재는 현재 뷰 _m에 포커스를 설정하는 데 문제가있어 위젯/뷰를 먼저 눌러야합니다. setFocus()를 호출해도 문제가 해결되지 않았습니다. 그 어떤 아이디어? – Gerstmann

0

먼저 레이아웃에서보기를 제거하십시오. 그런 다음보기를 삭제하십시오. 이 목적으로 레이아웃의 removeWidget, removeItem 메소드를 사용할 수 있습니다.

레이아웃이 삭제 뷰에 액세스하려고 시도하고 있습니다.

이 또한 Qt - remove all widgets from layout? 질문을 읽으십시오. 그것은 당신에게 통찰력을 줄지도 모릅니다.

관련 문제