我最近在Qt 5.7应用程序中遇到了exit code 255。在添加我的自定义QGestureRecognizer之后,就发生了这种情况。我调试了Qt的源代码,得出的结论是QGestureManager自动处理所有QGestureRecognizer实例。导致该问题的行位于创建和注册识别器的小部件的析构函数中:

Demo::~Demo() {
  // delete other stuff

  delete recognizer;
}


问题是QGestureRecognizer不支持(至少根据文档并查看构造函数的签名)Qt中的parent-child关系,因为它不是从QObject(或该基本Qt类的任何子类)派生的。这意味着不能将parent分配给其构造函数,因此QCustomGestureRecognizer recognizer = new QCustomGestureRecognizer (this)是不可能的。继续这种思路,这意味着必须通过调用delete recognizer手动触发析构函数。或者我以为...

在应用程序生命周期结束时,将调用QGestureManager。在其中有一个称为m_recognizers的识别器列表。它包含一堆内置识别器(例如用于Tap手势的识别器)以及已注册的自定义识别器(在我的情况下,它已注册为257)。 QGestureManager的析构函数遍历列表并删除其条目。

delete recognizer行出现时,当qDeleteAll(...)(对于m_recognizers)到达自定义识别器的条目时,由于它试图删除已删除的内容,因此出现了分段错误。

在我将小部件的析构函数中的delete recognizer行注释掉之后,我不再面临该问题,但是我仍然不确定是否没有在某个地方破坏我的代码。退出代码不是(按预期)0,但是正式文档中完全没有有关识别器处理方式的信息。

有没有人遇到这个问题?我并没有排除问题可能来自代码的其他部分,尽管考虑到在调用默认QWidget析构函数时会出现的可能性似乎很小。根据C ++标准,当继承类时,首先调用子类的析构函数(在我的情况下,这是Demo定制小部件-在那里没有问题),然后是基类。

最佳答案

如果您使用

Qt::GestureType QGestureRecognizer::registerRecognizer(QGestureRecognizer *recognizer)


系统确实拥有该对象的所有权,因此您不应该自己删除它。

文档摘录:


  该应用获取识别器的所有权并返回
  与之关联的手势类型ID。

关于c++ - QGestureManager自动销毁QGestureRecognizer吗?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/38736059/

10-08 22:50