QEstureRecognizer由QEstureManager自动销毁

QGestureRecognizer automatically destroyed by QGestureManager?

本文关键字:QEstureManager QEstureRecognizer      更新时间:2023-10-16

我最近在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。