デリゲートの QComboBox 子孫エディターで「C++ オブジェクトが破棄されました」

StackOverflow https://stackoverflow.com/questions/2468587

  •  20-09-2019
  •  | 
  •  

質問

QtColorCombo を使用して、色を保持するようにコンボボックスを変更しました (http://qt.nokia.com/products/appdev/add-on-products/catalog/4/Widgets/qtcolorcombobox) 「詳細...」ボタンの実装の詳細については、ハウツーとして説明します。Linux 上の C++ および 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()をオーバーライドし、次のようにしました。

  • マウスボタンを離す
  • フォーカスアウト
  • 離れる
  • ペイント
  • 入力
  • 離れる
  • 集中する
  • !!!!!!!!!QtGui.QColorDialog.getColor()
  • ウィンドウがブロックされています
  • ペイント
  • ウィンドウの非アクティブ化
  • !!!!!!!!!「CloseEditor」が起動します。
  • 隠れる
  • 親に隠す
  • フォーカスアウト
  • 遅延削除
  • !!!!!!!!!#6e6eff

環境によって動作が異なる理由を誰かが説明し、これを修正するための回避策を教えてくれませんか。最小限の例を次に示します。http://docs.google.com/Doc?docid=0Aa0otNVdbWrrZDdxYnF3NV80Y20yam1nZHM&hl=ja

役に立ちましたか?

解決

問題はQColorDialog.color()はその直後に閉じコンボからフォーカスを取るモーダルダイアログを示し、その後、デリゲートがメールで送信...それを破壊するという、事実のようです。 だから、このような問題を解決するための回避策は、イベントの中断があります:

デリゲートでます:

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に設定する必要があります。 QColorDialogを示し要素、上の信号火災を「highlited」とき、私はこれをやってます。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top