自定义 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" );
}
};
然后作为示例,我在 main 中使用 ViewManager:
int main( int argc, char *argv[] ) {
QApp app...
ViewManager man;
man.changeView( "main" );
app.exec();
}
当我第一次更改视图时,它工作得很好,然后当我再次更改视图时时间,它出现段错误!您可能认为当我删除 currentView_m 指针时会出现段错误,但事实并非如此!分段错误发生在程序退出changeView-slot之后。
我不知道如何调试它,因为程序崩溃并显示反汇编程序转储,并且堆栈跟踪仅显示乱码。
难道是在槽调用之后,程序进入了 QApplication 事件循环并在那里崩溃了?我在 View 实现中使用自定义小部件来覆盖一些受保护的 QWidget 事件。
I'm developing a Symbian application.
I've written a system for easily changing views, roughly like this:
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" );
}
};
Then as an example, I'm using the ViewManager in main:
int main( int argc, char *argv[] ) {
QApp app...
ViewManager man;
man.changeView( "main" );
app.exec();
}
When I change the view the first time, it works just fine, then when I change the view another time, it segfaults! You might think it segfaults when I delete the currentView_m pointer, but no! The segmentation fault happens right after the program exits the changeView-slot.
I have no idea how to debug this, as the program crashes and shows a disassembler dump, and the stack trace shows only gibberish.
Could it be that after the slot call, the program goes to the QApplication event loop and crashes there? I'm using a custom widgets inside View implementations that override some of the protected QWidget events.
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
您正在删除正在处理其信号的对象。只需对对象调用
deleteLater()
即可,将删除推迟到“安全”点,而不是删除。You are deleting a object the signal of which you are processing. Instead of
delete
, just calldeleteLater()
on the object, deferring the deletion to a "safe" point.首先尝试从布局中删除视图。然后删除视图。为此,您可以使用布局的removeWidget、removeItem 方法,
布局可能会尝试访问删除视图。
另请阅读此 Qt - 从布局中删除所有小部件? 问题。它可能会给你洞察力。
Try removing the view from your layout first. Then delete the view. You can use removeWidget,removeItem methods of layout for this purpose
Layout might be trying to access a delete view.
Read this Qt - remove all widgets from layout? question as well. It might give you insight.