デリゲートの QComboBox 子孫エディターで「C++ オブジェクトが破棄されました」
-
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」とき、私はこれをやってます。