【发布时间】: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