【问题标题】:QGestureRecognizer automatically destroyed by QGestureManager?QGestureRecognizer 被 QGestureManager 自动销毁?
【发布时间】:2016-12-08 17:31:49
【问题描述】:

我最近在我的 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 自定义小部件 - 没有问题),然后是基类。

【问题讨论】:

    标签: c++ qt destructor gesture-recognition


    【解决方案1】:

    如果你使用

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

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

    文档摘录:

    应用程序获取识别器的所有权并返回 与其关联的手势类型 ID。

    【讨论】:

    • 谢谢。我想了这么多:P 仍然很高兴看到它实际上在文档中被提及。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多