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 구현 내에서 사용자 정의 위젯을 사용하고 있습니다.
삭제 대신 deleteLater()를 호출하면 충돌이 해결되지만 현재는 현재 뷰 _m에 포커스를 설정하는 데 문제가있어 위젯/뷰를 먼저 눌러야합니다. setFocus()를 호출해도 문제가 해결되지 않았습니다. 그 어떤 아이디어? – Gerstmann