我正在开发一个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();
}
当我改变视图的第一次,它工作得很好,然后当我再次更改视图时,它会发生段错误!当我删除currentView_m指针时,你可能会认为它是段错误,但不是!程序退出changeView-slot后,会发生分段错误。
我不知道如何调试,因为程序崩溃并显示反汇编转储,堆栈跟踪只显示乱码。
难道是在槽调用之后,程序进入QApplication事件循环并在那里崩溃?我在View实现中使用了一个自定义的小部件,它覆盖了一些受保护的QWidget事件。
调用deleteLater()而不是delete解决了崩溃问题,但是我现在在为currentView_m设置焦点时遇到了问题,我必须先按widget/view。调用setFocus()并没有解决问题。任何想法? – Gerstmann 2011-05-13 11:23:47