委托中的QComboBox后代编辑器中的“C ++对象被破坏”

时间:2010-03-18 09:16:58

标签: pyqt qcombobox qitemdelegate

我已经修改了组合框以保持颜色,使用QtColorCombo(http://qt.nokia.com/products/appdev/add-on-products/catalog/4/Widgets/qtcolorcombobox)作为“更多...”按钮实现细节的方法。它在C ++和Linux上的PyQt中运行良好,但是当在Windows上的PyQt中使用此控件时,我得到“底层C ++对象被破坏”。它会像以下错误一样发生:

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

也许控制台输出会有所帮助。我在编辑器中覆盖了event()并得到了:

  • MouseButtonRelease
  • FocusOut
  • 保留
  • 画笔
  • 输入
  • 离开
  • 的focusIn
  • !!!!!!!!! QtGui.QColorDialog.getColor()
  • WindowBlocked
  • 油漆
  • WindowDeactivate
  • !!!!!!!!! 'CloseEditor'开火!
  • 隐藏
  • HideToParent
  • FocUsOut
  • DeferredDelete
  • !!!!!!!!! #6e6eff

有人可以解释一下,为什么在不同的环境中存在这样的不同行为,并且可能会提供解决方法来解决这个问题。 这是最小的例子: http://docs.google.com/Doc?docid=0Aa0otNVdbWrrZDdxYnF3NV80Y20yam1nZHM&hl=en

1 个答案:

答案 0 :(得分:1)

问题似乎是一个事实,QColorDialog.color()显示模式对话框,它从组合中获取焦点,然后在此之后立即关闭,然后委托销毁它.. ooops。 因此,解决此类问题的解决方法是事件中断:

在代表中:

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)

在编辑器中,我们必须引入标志self.canFocusOut,并在禁止使用FocusOut时将其设置为true。当'highlited'信号在元素上触发时,我正在这样做,显示QColorDialog。