QGestureRecognizer автоматически уничтожается QGestureManager?

Я недавно испытал exit code 255 в моем приложении Qt 5.7. Это произошло сразу после того, как я добавил свой обычай QGestureRecognizer, Я отладил источники Qt и пришел к выводу, что QGestureManager автоматически избавляется от всех QGestureRecognizer экземпляров. Строка, которая вызывает проблему, находится внутри деструктора виджета, где распознаватель создан и зарегистрирован:

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

delete recognizer;
}

Дело в том QGestureRecognizer не поддерживает (по крайней мере, согласно документации и, глядя на подпись конструктора) parent-child отношения в Qt, так как он не является производным от 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 Кастомный виджет — проблем нет), а затем и базовый класс.

0

Решение

Если вы используете

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

Система вступает во владение объектом, и вы не должны удалять его самостоятельно.

Выдержка из документации:

Приложение становится владельцем распознавателя и возвращает
ID типа жеста, связанный с ним.

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]