"كائن C ++ تم تدميره" في محرر سليل QCombobox في المندوب

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

  •  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.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top