среда, 14 января 2009 г.

Трабла setHidden у QTreeWidgetItem

Суть проблемы

Есть дерево (QTreeWidget) элементов (QTreeWidgetItem). По событию некоторые элементы нужно скрыть, а скрытые отобразить, для чего используется функция setHidden у QTreeWidgetItem. После фильтрации это все сортируется:

def add_subitems(self, root_item):        
'''Добавить элементы к корневому элементу'''

def add(text, hide=False):
sub_item = QtGui.QTreeWidgetItem(root_item)
sub_item.setText(0, text)
sub_item.setHidden(hide)

map(lambda val: add(*val), ( ('one',),
('two', True),
('three',) ))

def update_subitems(self, root_item):
'''Обновить под-элементы - скрыть или отобразить'''

for index in range(root_item.childCount()):
item = self.root_item.child(index)
# для упрощения скрываются видимые элементы,
# а скрытые отображаются
item.setHidden(not item.isHidden())

self.treeWidget.sortItems(0, QtCore.Qt.AscendingOrder)

Если update_subitems вызывается когда окно скрыто (свернуто в трей), часть вызовов setHidden отрабатывается не правильно и при восстановлении окна из трея пользователь видит не то, что должен видеть. Если убрать сортировку или не скрывать окно - все работает как надо.

Решение

Единственное решение, которое я нашел - отлавливать момент, когда окно отображается (QShowEvent) и обновлять дерево еще раз:
def event(self, ev):
if ev.type()==QtCore.QEvent.Show:
#....
self.update_subitems(root_item)

Комментариев нет: