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

È stato utile?

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top