2010-03-18 4 views
1

У меня есть измененное поле со списком, чтобы удерживать цвета, используя QtColorCombo (http://qt.nokia.com/products/appdev/add-on-products/catalog/4/Widgets/qtcolorcombobox) как как для деталей реализации кнопки «подробнее ...». Он отлично работает на C++ и в PyQt на linux, но при использовании этого элемента управления в PyQt в Windows я получаю «базовый объект C++». Он выглядит следующим образом:«Объект C++ уничтожен» в редакторе потомков QComboBox в делегате

... 
# in constructor: 
self.activated.connect(self._emitActivatedColor) 
... 
def _emitActivatedColor(self, index): 
    if self._colorDialogEnabled and index == self.colorCount(): 
     print '!!!!!!!!! QtGui.QColorDialog.getColor()' 
     c = QtGui.QColorDialog.getColor() # <----- :(delegate fires 'closeEditor' 
     print '!!!!!!!!! ' + c.name() 

     if c.isValid(): 
      self._numUserColors += 1 
      #at the next line currentColor() tries to access C++ layer and fails 
      self.addColor(c, self.currentColor().name()) 

      self.setCurrentIndex(index) 
... 

Возможно, консольный выход поможет. Я перекрытый событие() в редакторе и получил:

  • MouseButtonRelease
  • FocusOut
  • Оставить
  • Краска
  • Введите
  • Оставить
  • FocusIn
  • !!!! !!!!! QtGui.QColorDialog.getColor()
  • WindowBlocked
  • Краска
  • WindowDeactivate
  • !!!!!!!!! «ЗакрытьEditor» срабатывает!
  • Скрыть
  • HideToParent
  • FocUsOut
  • DeferredDelete
  • !!!!!!!!! # 6e6eff

Может кто-нибудь объяснить, почему существует такое другое поведение в разных средах и, возможно, обходное решение, чтобы исправить это. Вот минимальный пример: http://docs.google.com/Doc?docid=0Aa0otNVdbWrrZDdxYnF3NV80Y20yam1nZHM&hl=en

ответ

1

Проблема, кажется, факт, что QColorDialog.color() показывает модальный диалог, который принимает фокус с комбо, который закрывается сразу же после этого, то делегат уничтожает его .. по электронной почте Ой , Таким образом, обходной путь для решения таких проблем является прерыванием события:

В делегате:

def eventFilter(self, editor, event): 
    if event.type() == QtCore.QEvent.FocusOut and hasattr(editor, 'canFocusOut'): 
     if not editor.canFocusOut: return False 
    return QtGui.QItemDelegate.eventFilter(self, editor, event) 

В редакторе мы должны ввести self.canFocusOut флага и установить его верно, когда FocusOut запрещено. Я делаю это, когда на элементе загорается сигнал «highlited», который показывает QColorDialog.