Объект C ++ разрушен »в редакторе потомков Qcombobox в делегате

StackOverflow https://stackoverflow.com/questions/2468587

  •  20-09-2019
  •  | 
  •  

Вопрос

У меня есть модифицированный ComboBox, чтобы удерживать цвета, используя QTColorCombo (http://qt.nokia.com/products/appdev/add-on-products/catalog/4/widgets/qtcolorcombobox) как Howto для деталей реализации кнопки «Больше ...». Он отлично работает в 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)
...

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

  • MousebuttonRelease
  • Focusout
  • Оставлять
  • Краска
  • Войти
  • Оставлять
  • Сосредоточиться
  • !!!!!!!!!! Qtgui.qcolordialog.getColor ()
  • Окно блокировано
  • Краска
  • WindowDeactivate
  • !!!!!!!!!! «Закрытие» стреляет!
  • Скрывать
  • Hidetoparent
  • Focusout
  • DEFERREDDELETE
  • !!!!!!!!!! #6E6EFF

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

Это было полезно?

Решение

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

В делегате:

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)

В редакторе мы должны представить Flag Self.canfocusout и установить его на True, когда Focusout запрещена. Я делаю это, когда «высококачественный» сигнал пожаров на элементе показывает Qcolordialog.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top