QGestureRecognizer 自动被QGestureManager 销毁?

QGestureRecognizer automatically destroyed by QGestureManager?

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

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

  delete recognizer;
}

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

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

delete recognizer 行出现时,当 qDeleteAll(...)(对于 m_recognizers)到达自定义识别器的条目时,我会收到一个分段错误,因为它试图删除已经存在的内容已删除。

在我的小部件析构函数中注释掉 delete recognizer 行后,我不再遇到这个问题,但是我仍然不确定我是否在某处破坏了我的代码。退出代码不是(如预期的那样)0,但官方文档中完全缺少有关如何处理识别器的信息。

有人遇到过这个问题吗?我不排除问题是由我的代码的其他部分引起的可能性,尽管考虑到它在调用默认 QWidget 析构函数时出现,这似乎不太可能。根据 C++ 标准,当继承 class 时,首先调用 subclass' 析构函数(在我的例子中,这是 Demo 自定义小部件 - 那里没有问题)然后是基础 class.

如果你使用

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

系统确实取得了该对象的所有权,您不应自行删除它。

文档摘录:

The application takes ownership of the recognizer and returns the gesture type ID associated with it.