So, one more attempt. Previous articles (part1, part2) mentioned possible solutions to fix crash insinde the QTreeWidget and QAccessibleTableCell.
Unfortunately, deselecting current item still doesn’t fix all issues. The problem with deselection is that it’s not handled correctly via QAccessibleTableCell:
If current index isn’t valid, QAccessible doesn’t correctly update currect QAccessibleTableCell object which caused all this evil crashes.
So there are two ways how to fix it. One is to manually set QAccessibleTableCell but I didn’t find a way how to do that. The second way is to disable QAccessible for Property editor. Unfortunately it’s not an easy task. In QAccessible exists method setActive:
QAccessible::setActive(false)
But this method works only with AccessibleObserver class but not with QPlatformAcessibility which handles real QAcessible::isActive result. Because of this it’s necessary to update setActive method in file qacessible.cpp inside the Qt.
Original method:
void QAccessible::setActive(bool active) { for (int i = 0; i < qAccessibleActivationObservers()->count() ;++i) qAccessibleActivationObservers()->at(i)->accessibilityActiveChanged(active); }
and updated version:
void QAccessible::setActive(bool active) { #ifndef QT_NO_ACCESSIBILITY if ( QPlatformAccessibility *pfAccessibility = platformAccessibility() ) pfAccessibility->setActive(active); #endif for (int i = 0; i < qAccessibleActivationObservers()->count() ;++i) qAccessibleActivationObservers()->at(i)->accessibilityActiveChanged(active); }
In case you will find better way how to turn off accessibility, please let me know.
But there is still one more problem. Occasionally OS X decides to switch accessible back on:
And this is probably the reason why everything works ok on older OS X but not on 10.10. Because OS X 10.10 randomly turns accessible on which causes this crash. Accessible is usually turned on when opening some modal dialog.
This explains why opening an empty dialog increased the probability to crash the application. The only solution I have found is to disable QAccessible every time the PropertyEditor is cleared up.
Just stumbled on the same problem with QTreeWidget (on Mac 10.10 with Qt 5.7, so this issue is still active).
Solution that worked for me was removing items one by one instead using QTreeWidget::clear()
Sth like:
const int tlic=topLevelItemCount();
for(int i=0;i<tlic;i++) takeTopLevelItem(0);
Thank you for this article, it helped me to better understand the problem from the start and saved me few hours of bashing my head to the wall
Interesting. I will try your solution too.