Question

Je l'ai modifié combobox de tenir des couleurs, en utilisant QtColorCombo ( http://qt.nokia.com/products/appdev/add-on-products/catalog/4/Widgets/qtcolorcombobox ) comme guide pratique pour les « plus ... » bouton détails de mise en œuvre. Il fonctionne très bien en C ++ et PyQt sur linux, mais je reçois « sous-objet C ++ a été détruit » lorsque l'utilisation de ce contrôle dans PyQt sous Windows. Il Seels comme l'erreur se produit lorsque:

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

console Peut-être que la sortie vous aidera. J'ai événement () redéfinie dans l'éditeur et a obtenu:

  • MouseButtonRelease
  • FocusOut
  • Laisser
  • Peinture
  • Entrée
  • Laisser
  • FocusIn
  • !!!!!!!!! QtGui.QColorDialog.getColor ()
  • WindowBlocked
  • Peinture
  • WindowDeactivate
  • !!!!!!!!! 'CloseEditor' incendies!
  • Masquer
  • HideToParent
  • focusOut
  • DeferredDelete
  • !!!!!!!!! # 6e6eff

Quelqu'un peut-il expliquer pourquoi il y a un tel comportement différent dans les différents environnements, et peut-être donner une solution pour résoudre ce problème. Voici l'exemple minimal: http://docs.google.com/Doc?docid=0Aa0otNVdbWrrZDdxYnF3NV80Y20yam1nZHM&hl=en

Était-ce utile?

La solution

Le problème semble être un fait, que QColorDialog.color () La boîte de dialogue modale, qui prend le focus de combo, qui se ferme immédiatement après, puis délégué détruit .. ooops. Donc, la solution de contournement pour résoudre ces problèmes est l'interruption de l'événement:

Dans le délégué:

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)

Dans l'éditeur, nous devons introduire le self.canFocusOut du pavillon et le mettre à vrai lorsque FocusOut est interdit. Je fais quand « highlited » feux de signalisation sur l'élément, qui montre QColorDialog.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top