2015-05-21 3 views
0

последние несколько дней Я пытаюсь решить эту странную катастрофу, которая возникает только на OS X 10.10. Я слегка модифицировал QtTreePropertyBrowser с кнопками внутри строки свойств:QtPropertyBrowser/QTreeModel сбой при очистке

Этих кнопки излучают сигналы при нажатии и некоторые действия вызвали очистки дерева и восстановления его снова. К сожалению, это вызывает крах.

Я думал, что это связано с очисткой дерева внутри обработки сигнала, но очередность его через QEvent не помогает. Проблема заключается в том, что иногда происходит сбой, когда некоторое время после удаления дерева.

Все аварии заканчиваются одной из этих двух callstacks:

QTreeModel::index(QTreeWidgetItem const*, int) const + 176 
QTreeModel::parent(QModelIndex const&) const + 75 
QTreeView::isIndexHidden(QModelIndex const&) const + 71 
QTreeView::visualRect(QModelIndex const&) const + 93 
QAccessibleTableCell::rect() const + 29 
QAccessibleTableCell::state() const + 146 
QCocoaAccessible::hasValueAttribute(QAccessibleInterface*) + 58 
[QMacAccessibilityElement accessibilityAttributeNames] + 398 
NSAccessibilityEntryPointAttributeNames + 115 
[NSObject(NSAccessibilityInternal) _accessibilityAttributeNamesClientError:] + 56 

или

QTreeModel::data(QModelIndex const&, int) const + 46 
QAccessibleTableCell::state() const + 347 
QCocoaAccessible::hasValueAttribute(QAccessibleInterface*) + 58 
[QMacAccessibilityElement accessibilityAttributeNames] + 398 
NSAccessibilityEntryPointAttributeNames + 115 
[NSObject(NSAccessibilityInternal) _accessibilityAttributeNamesClientError:] + 

код Краш выглядит следующим образом:

и

на основе кода, мне кажется, как ошибка в TreeModel, где некоторые индексы не прояснилась после того, как модель дерева стирается. К сожалению, я не разработчик Mac (но Windows), и я не могу полностью понять, что происходит с индексами из-за неполного рабочего отладчика в QtCreator. Но на основании сбоя кажется, что в обоих случаях item не является допустимым указателем.

Что иногда помогает установить фокус на другой виджет, прежде чем очистить дерево свойств (как я описал здесь). Но это исправление не всегда срабатывает, а иногда приложение все еще падает.

Я уже извлек весь код из основного приложения и создал минимальный тестовый пример. Я пробовал много чего, но безуспешно.

Что не работает:

  • деактивировать фокус из окна перед очисткой
  • выполнить ясно, вне обработки сигналов с помощью создания QEvent с действием
  • очистить свойство дерева один-на-один вместо метода clear()
  • перекомпилировать тестовый проект с последней версией Qt 5.5 beta
  • для компиляции приложения на более раннюю ОС X (10.9) и выполнить его на 10.10

Что работает:

  • скомпилировать тот же код на Windows/Linux
  • выполнить один и тот же код на старой ОС X

Вот пример того, как приложение аварии: https://dl.dropboxusercontent.com/u/11355235/ShareX/2015-05/2015-05-21_15-28-56.mp4

Самый простой способ выполнить эту ошибку - очистить дерево свойств и открыть любой Диалог (который выполняет цикл событий, который, вероятно, вызывает сбой)

on_btnStandaloneDialog_clicked(); 
m_propertyBrowser->clear(); 
on_btnStandaloneDialog_clicked(); 

Минимальное приложение тест доступен здесь: https://www.dropbox.com/s/dbnd3inbwpfc6l9/property-tree-crash.zip?dl=0

Я буду рад за любые идеи или помочь с этой проблемой (платную помощь тоже, если это разрешено здесь). Пожалуйста, дайте мне знать, если потребуется дополнительная информация.

+0

Вы хотите, чтобы мы отлаживали файл mp4? Нет SSCCE там, бесполезные скриншоты. Голосовать, чтобы закрыть ... –

+0

Три вещи: (1) скриншоты не относятся к коду, где он идет «бум», стек вызовов говорит вам, где это, (2) вы пытались запустить valgrind на нем, чтобы увидеть, если он сообщает любые записи/чтения в память, которые не должны происходить, (3) вы пытались явно использовать очередное соединение, а не прямое соединение с сигналом/слотом, чтобы выяснить, имеет ли значение порядок событий? – user268396

+1

Я думаю, что функция 'item (index);' возвращает недействительный указатель на 'QTreeWidgetItem'. Проверь это. – vahancho

ответ

0

Вся проблема была в реализации Qt Accessibility на OS X.

Когда активный элемент на дереве проекта изменяются, также QAccessibleTableCell обновляется, к сожалению, когда активный элемент выключенный (индекс не является действительным), QAccessibleTableCell ISN» t обновлено.

Благодаря этой очистке дерево свойств вызывает сбои, поскольку QAccessibleTableCell пытается получить доступ к недействительным данным.

Я написал более подробное описание on my blog.

 Смежные вопросы

  • Нет связанных вопросов^_^