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

Foi útil?

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top