Pregunta

He modificado cuadro combinado para mantener los colores, utilizando QtColorCombo ( http://qt.nokia.com/products/appdev/add-on-products/catalog/4/Widgets/qtcolorcombobox ) como howto para los 'más ...' botón de detalles de implementación. Funciona bien en C ++ y en PyQt en Linux, pero me da 'C subyacente objeto ++ fue destruido' cuando el uso de este control en PyQt en Windows. Se Seels como sucede cuando el error:

...
# 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)
...

Tal consola de salida será de ayuda. He anulado evento () en el editor y tengo:

  • MouseButtonRelease
  • focusOut
  • Deja
  • Paint
  • Intro
  • Deja
  • focusIn
  • !!!!!!!!! QtGui.QColorDialog.getColor ()
  • WindowBlocked
  • Paint
  • WindowDeactivate
  • !!!!!!!!! incendios 'CloseEditor'!
  • Ocultar
  • HideToParent
  • focusOut
  • DeferredDelete
  • !!!!!!!!! # 6e6eff

¿Puede alguien explicar por qué hay un comportamiento muy diferente en los distintos entornos, y tal vez dar una solución alternativa para solucionar este problema. Aquí está el ejemplo mínimo: http://docs.google.com/Doc?docid=0Aa0otNVdbWrrZDdxYnF3NV80Y20yam1nZHM&hl=en

¿Fue útil?

Solución

El problema parece ser un hecho, que QColorDialog.color () muestra el diálogo modal, que toma el foco del combinado, que se cierra inmediatamente después de eso, entonces delegado destruye .. ooops. Por lo tanto, la solución para resolver este tipo de problemas es la interrupción de eventos:

En el 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)

En el editor tenemos que introducir la self.canFocusOut bandera y configurarlo para que cierto cuando está prohibido focusOut. Estoy haciendo esto cuando 'highlited' señales de fuego en el elemento, que muestra QColorDialog.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top