QEstureRecognizer由QEstureManager自动销毁
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类的任何子类)派生的。这意味着不能将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。