'C ++ objeto destruído' no editor de descendente Qcombobox no delegado
-
20-09-2019 - |
Pergunta
Eu modifiquei o ComboBox para segurar cores, usando qtcolorcombo (http://qt.nokia.com/products/appdev/add-on-products/catalog/4/widgets/qtcolorcombox) como como os detalhes da implementação do botão 'mais ...'. Funciona bem no C ++ e no PYQT no Linux, mas eu recebo 'objeto C ++ subjacente foi destruído' ao usar esse controle no PYQT no Windows. Seels como se o erro acontece 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)
...
Talvez a saída do console ajude. Eu substituí o evento () no editor e obtive:
- MouseButtonRelease
- Foco
- Sair
- Pintar
- Digitar
- Sair
- Foco no
- !!!!!!!!! Qtgui.qcolordialog.getColor ()
- Windowlocked
- Pintar
- WindowDeActivate
- !!!!!!!!! 'Closeditor' dispara!
- Esconder
- Hidetoparent
- Foco
- Adiado
- !!!!!!!!! #6e6eff
Alguém pode explicar, por que existe um comportamento tão diferente nos diferentes ambientes e talvez dar uma solução alternativa para consertar isso. Aqui está o exemplo mínimo:http://docs.google.com/doc?docid=0aa0otnvdbwrrzdxynf3nv80y20yam1nzhm&hl=en
Solução
O problema parece ser um fato, que o qcolordialog.color () mostra diálogo modal, que tira o foco do combo, que fecha imediatamente depois disso, o delegado o destrói .. ooops. Portanto, a solução alternativa para resolver esses problemas é a interrupção do evento:
No delegado:
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)
No editor, temos que introduzir a bandeira. Estou fazendo isso quando o sinal 'Highlited' dispara no elemento, que mostra Qcolordialog.