我正在开发一个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事件。
答案 0 :(得分:1)
您正在删除正在处理的信号的对象。而不是delete
,只需在对象上调用deleteLater()
,将删除推迟到“安全”点。
答案 1 :(得分:0)
首先尝试从布局中删除视图。然后删除视图。您可以为此目的使用removeWidget,removeItem布局方法
布局可能正在尝试访问删除视图。
同时阅读此Qt - remove all widgets from layout?问题。它可能会给你见解。