«Объект C ++ уничтожен» в редакторе потомков QComboBox в делегате - PullRequest
1 голос
/ 18 марта 2010

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

...
# 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)
...

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

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

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

1 Ответ

1 голос
/ 18 марта 2010

Кажется, что проблема в том, что 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 и установить его в значение true, когда FocusOut запрещен. Я делаю это, когда «подсвеченный» сигнал срабатывает на элементе, который показывает QColorDialog.

...