我正在開發一個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