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