'C ++ oggetto distrutto' in QComboBox editor di discendente in delegato
-
20-09-2019 - |
Domanda
Ho modificato combobox per contenere i colori, utilizzando QtColorCombo ( http://qt.nokia.com/products/appdev/add-on-products/catalog/4/Widgets/qtcolorcombobox ) come howto per il 'più' ... pulsante dettagli di implementazione. Funziona bene in C ++ e in PyQt su linux, ma ottengo 'sottostante C ++ oggetto è stato distrutto' quando uso questo controllo in PyQt su Windows. E Seels come l'errore si verifica quando:
...
# 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)
...
Forse console di output sarà di aiuto. Ho sovrascritte evento () nell'editor ed ho ottenuto:
- MouseButtonRelease
- focusOut
- Lascia
- Colore
- Invio
- Lascia
- focusIn
- !!!!!!!!! QtGui.QColorDialog.getColor ()
- WindowBlocked
- Colore
- WindowDeactivate
- !!!!!!!!! 'CloseEditor' incendi!
- Nascondi
- HideToParent
- focusOut
- DeferredDelete
- !!!!!!!!! # 6e6eff
Qualcuno può spiegare, perché c'è un tale comportamento diverso nei diversi ambienti, e magari dare una soluzione per risolvere questo problema. Ecco l'esempio minimo: http://docs.google.com/Doc?docid=0Aa0otNVdbWrrZDdxYnF3NV80Y20yam1nZHM&hl=en
Soluzione
Il problema sembra essere un dato di fatto, che QColorDialog.color () mostra finestra di dialogo modale, che prende a fuoco da combo, che si chiude subito dopo che, allora delegato distrugge .. ooops. Quindi, la soluzione per risolvere questi problemi è l'interruzione dell'evento:
Nel delegato:
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)
In redattore dobbiamo introdurre il self.canFocusOut bandiera e impostarlo su true quando focusOut è vietato. Sto facendo questo quando 'highlited' fuochi di segnalazione sull'elemento, che dimostra QColorDialog.