1

そこで、一連のカスタム スライダー ウィジェットを管理するプログラムを作成しています。現在、スライダーオブジェクト(クラス)のリストを保持するslider_container(クラス)があります。これらのスライダー オブジェクトは、メイン ウィンドウのレイアウトに挿入されます。スライダーの位置を上下に追加して移動するだけで、これはうまく機能しています。しかし、スライダーを削除しようとすると、すべてがうまくいきません。スライダーのリストが操作 (スライダーの追加、移動、または削除) されるたびに、以下に示すようにメイン ウィンドウでクリア関数と再構築関数が呼び出されます。

def clear_layout(self, layout):
    print "Cleared Layout..."
    while layout.count() > 0:
        item = layout.takeAt(0)
        widget = item.widget()
        if widget is not None:
            widget.deleteLater()

def rebuild_slider_display(self):
    """ Delete the old sliders, then add all the new sliders """
    self.clear_layout(self.slider_layout)


    print "Rebuild layout..."
    print len(self._widgets.widgets)
    for i, widget in enumerate(self._widgets.widgets):
        print widget.slider_name, " ", i
        self.slider_layout.insertWidget(i, widget)
    print "Layout widget count: ", self.slider_layout.count()

現在、この行「self.slider_layout.insertWidget(i, widget)」でこのエラーが発生しています。

    RuntimeError: wrapped C/C++ object of type SliderWidget has been deleted 

私の推測では、実際のウィジェットをウィジェット コンテナーに格納するのは悪い形です。ウィジェットを deleteLater() するとどうなるのかと思いますが、リストからウィジェットを削除するだけでなく、実際にはウィジェットコンテナ自体に格納されていたウィジェットクラスを削除します。

うまくいけば、それが明確に説明されます。事前に助けてくれてありがとう。

編集:

ウィジェットクラスは次のとおりです。

class SliderWidget(QWidget, ui_slider_widget.Ui_SliderWidget):
""" Create a new slider. """
def __init__(self, name, slider_type, digits, minimum, maximum, value, index, parent=None):
    super(SliderWidget, self).__init__(parent)
    self.setupUi(self)

    self.slider_name = QString(name)
    self.expression = None
    self.accuracy_type = int(slider_type)
    self.accuracy_digits = int(digits)
    self.domain_min = minimum
    self.domain_max = maximum
    self.domain_range = abs(maximum - minimum)
    self.numeric_value = value
    self.index = index

    #self.name.setObjectName(_fromUtf8(slider.name))
    self.update_slider_values()

    self.h_slider.valueChanged.connect(lambda: self.update_spinbox())
    self.spinbox.valueChanged.connect(lambda: self.update_hslider())
    self.edit.clicked.connect(lambda: self.edit_slider())

# A unique has for the slider.    
def __hash__(self):
    return super(Slider, self).__hash__()

# How to compare if this slider is less than another slider.    
def __lt__(self, other):
    r = QString.localAware.Compare(self.name.toLower(), other.name.toLower())
    return True if r < 0 else False

# How to compare if one slider is equal to another slider.    
def __eq__(self, other):
    return 0 == QString.localAwareCompare(self.name.toLower(), other.name.toLower())

そして、ウィジェットコンテナでのウィジェットの実際の作成は次のとおりです。

def add_slider(self, params=None):
    if params:
        new_widget = SliderWidget(params['name'], params['slider_type'], params['digits'], params['minimum'], 
                                    params['maximum'], params['value'], params['index'])
    else:
        new_widget = SliderWidget('Slider_'+str(self.count()+1), 1, 0, 0, 50, 0, self.count())

    #new_widget.h_slider.valueChanged.connect(self.auto_save)
    #new_widget.h_slider.sliderReleased.connect(self.slider_released_save)
    new_widget.move_up.clicked.connect(lambda: self.move_widget_up(new_widget.index))
    new_widget.move_down.clicked.connect(lambda:     self.move_widget_down(new_widget.index))
    self.widgets.append(new_widget)

助けてくれてありがとう!

4

1 に答える 1

0

私が抱えていた問題は、レイアウトをクリアする方法にありました。以下に示すように、レイアウトを下から上にクリアすることが重要です。

for i in reversed(range(layout.count())): 
    layout.itemAt(i).widget().setParent(None)
于 2013-06-21T02:36:51.757 に答える