Объект C ++ разрушен »в редакторе потомков Qcombobox в делегате
-
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.