последние несколько дней Я пытаюсь решить эту странную катастрофу, которая возникает только на 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
Я буду рад за любые идеи или помочь с этой проблемой (платную помощь тоже, если это разрешено здесь). Пожалуйста, дайте мне знать, если потребуется дополнительная информация.
Вы хотите, чтобы мы отлаживали файл mp4? Нет SSCCE там, бесполезные скриншоты. Голосовать, чтобы закрыть ... –
Три вещи: (1) скриншоты не относятся к коду, где он идет «бум», стек вызовов говорит вам, где это, (2) вы пытались запустить valgrind на нем, чтобы увидеть, если он сообщает любые записи/чтения в память, которые не должны происходить, (3) вы пытались явно использовать очередное соединение, а не прямое соединение с сигналом/слотом, чтобы выяснить, имеет ли значение порядок событий? – user268396
Я думаю, что функция 'item (index);' возвращает недействительный указатель на 'QTreeWidgetItem'. Проверь это. – vahancho