QGestureRecognizer会被QGestureManager自动销毁吗?

时间:2016-08-03 06:34:47

标签: c++ qt destructor gesture-recognition

我最近在Qt 5.7应用程序中遇到过exit code 255。这是在我添加自定义QGestureRecognizer之后发生的。我调试了Qt的源代码,我得出的结论是QGestureManager会自动处理所有QGestureRecognizer个实例。导致问题的行在widget的析构函数内部,其中创建并注册了识别器:

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

  delete recognizer;
}

事情是QGestureRecognizer不支持(至少根据文档和查看构造函数的签名)Qt中的parent-child关系,因为它不是从QObject派生的({1}}或该基础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自定义小部件 - 没有问题),然后是基类。

0 个答案:

没有答案