gpt4 book ai didi

c++ - QGestureRecognizer 自动被QGestureManager 销毁?

转载 作者:行者123 更新时间:2023-11-28 05:34:07 26 4
gpt4 key购买 nike

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

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

文档摘录:

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

关于c++ - QGestureRecognizer 自动被QGestureManager 销毁?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38736059/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com