Я занимаюсь разработкой приложения для 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, но нет! Ошибка сегментации происходит сразу после выхода программы из слота changeView.
Понятия не имею, как это отладить, так как программа аварийно завершает работу и показывает дамп дизассемблера, а трассировка стека показывает только бред.
Может быть, после вызова слота программа переходит в цикл обработки событий QApplication и вылетает там? Я использую собственные виджеты внутри реализаций View, которые переопределяют некоторые из защищенных событий QWidget.