主页 > IT业界  > 

[Qt]使用QUndoStack运行到cmd->isObsolete()崩溃

[Qt]使用QUndoStack运行到cmd->isObsolete()崩溃

redo/undo中又push了 崩溃情况崩溃原因解决方法

崩溃情况

在正常调用QUndoStack的redo/undo时,崩溃在了这里

unknown:0 QWidget: Cannot create a QWidget without QApplication

.

崩溃原因

在正常调用QUndoStack的redo/undo时,因为自身的逻辑处理,改变了某些值,其值的信号引起新建了QUndoCommand,并调用QUndoStack的push函数。

以redo为例子,从源码上看的话,就是这个还在859行的cmd->redo运行时,此时的d->index还没有+1,还是先前的下标,所以现在的d->index值还是d->command_list.size() - 1 而当redo中因为逻辑问题,给所处的QUndoStack新push了一个QUndoCommand时,因为上面的原因,就delete掉了这个还在运行的QUndoCommand 结果push完了,继续redo的时候,cmd已经被释放了,所以崩溃了 .

解决方法

处理好代码逻辑,别在QUndoCommand的redo/undo里面,出现引起push新的QUndoCommand操作。

标签:

[Qt]使用QUndoStack运行到cmd->isObsolete()崩溃由讯客互联IT业界栏目发布,感谢您对讯客互联的认可,以及对我们原创作品以及文章的青睐,非常欢迎各位朋友分享到个人网站或者朋友圈,但转载请说明文章出处“[Qt]使用QUndoStack运行到cmd->isObsolete()崩溃