2010-03-18 30 views
1

J'ai modifié la zone de liste déroulante pour conserver les couleurs, en utilisant QtColorCombo (http://qt.nokia.com/products/appdev/add-on-products/catalog/4/Widgets/qtcolorcombobox) comme méthode pour les détails d'implémentation du bouton 'more ...'. Cela fonctionne très bien en C++ et en PyQt sous Linux, mais je vois que l'objet C++ sous-jacent a été détruit lors de l'utilisation de ce contrôle dans PyQt sous Windows. Il se produit comme si l'erreur se produisait lorsque:'Objet C++ détruit' dans l'éditeur descendant de QComboBox dans le délégué

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

La sortie de la console peut être utile. J'ai événement() redéfinie dans l'éditeur et a obtenu:

  • MouseButtonRelease
  • FocusOut
  • Laissez
  • Peinture
  • Entrez
  • Laissez
  • FocusIn
  • !!!! !!!!! QtGui.QColorDialog.getColor()
  • WindowBlocked
  • Peinture
  • WindowDeactivate
  • !!!!!!!!! 'CloseEditor' tire!
  • Cacher
  • 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

Répondre

1

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 . Ainsi, 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 le fais lorsque le signal 'highlited' se déclenche sur l'élément, qui affiche QColorDialog.