"كائن C ++ تم تدميره" في محرر سليل QCombobox في المندوب
-
20-09-2019 - |
سؤال
لقد قمت بتعديل Combobox لعقد الألوان ، باستخدام QTColorCombo (http://qt.nokia.com/products/appdev/add-on-products/catalog/4/widgets/qtcolorcombobox) كما هو الحال بالنسبة لتفاصيل تنفيذ زر "المزيد ...". إنه يعمل بشكل جيد في C ++ وفي Pyqt على Linux ، لكنني تم تدمير "كائن C ++ الأساسي" عند استخدام هذا التحكم في PYQT على Windows. يعتقل مثل الخطأ عندما::
...
# 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)
...
ربما سيساعد إخراج وحدة التحكم. لقد تجاوزت الحدث () في المحرر وحصلت على:
- MouseButtonRelease
- Focusout
- غادر
- رسم
- يدخل
- غادر
- التركيز
- !!!!!!!!! qtgui.qcolordialog.getColor ()
- Windowblocked
- رسم
- WindowDeactive
- !!!!!!!!! حرائق "المقربة"!
- يخفي
- hidetoparent
- Focusout
- مؤجل
- !!!!!!!!! #6e6eff
هل يمكن لأي شخص أن يشرح ، لماذا يوجد مثل هذا السلوك مختلف في البيئات المختلفة ، وربما يعطي حلًا لإصلاح هذا. هذا هو الحد الأدنى من مثال:http://docs.google.com/doc؟docid=0aa0otnvdbwrzdxynf3nv80y20yam1nzhm&hl=en
المحلول
يبدو أن المشكلة هي حقيقة ، أن 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 ووضعه على True عندما يتم حظر Focusout. أقوم بذلك عند حرائق الإشارة "المرتفعة" على العنصر ، والتي تُظهر QColorDialog.