2016-12-08 1 views
0
def add_ranges(self): 
    self.ranges_layout = QtGui.QHBoxLayout()       # setup the ranges_layout, it will be a child of all_ranges_layout 
    self.min_label = QtGui.QLabel(self.normalization)     # setup the min label 
    self.max_label = QtGui.QLabel(self.normalization)     # setup the max label 
    self.min_lineEdit = QtGui.QLineEdit(self.normalization)    # setup the min lineEdit 
    self.max_lineEdit = QtGui.QLineEdit(self.normalization)    # setup the max lineEdit 
    self.all_ranges_layout.addLayout(self.ranges_layout)    # make ranges_layout a child of all_ranges_layout 
    self.ranges_layout.addWidget(self.min_label)      # apply the min label to the widget 
    self.ranges_layout.addWidget(self.min_lineEdit)      # apply the min lineEdit to the widget 
    self.ranges_layout.addWidget(self.max_label)      # apply the max label 
    self.ranges_layout.addWidget(self.max_lineEdit)      # apply the max lineEdit 
    self.min_label.setText(_translate("MainWindow", "Min", None))  # set the text of the min label 
    self.max_label.setText(_translate("MainWindow", "Max", None))  # set the text of the max label 

    self.min_lineEdits.append(self.min_lineEdit)      # set up an array of lineEdits 
    self.max_lineEdits.append(self.max_lineEdit)      # 

def del_ranges(self): 
    self.ranges_layout.removeWidget(self.min_label)      # remove the min label to the widget 
    self.ranges_layout.removeWidget(self.min_lineEdit)     # remove the min lineEdit to the widget 
    self.ranges_layout.removeWidget(self.max_label)      # remove the max label 
    self.ranges_layout.removeWidget(self.max_lineEdit)     # remove the max lineEdit 
    del self.min_lineEdits[-1]           # delete last element in list 
    del self.max_lineEdits[-1]           # delete last element in list 

enter image description here Нажмите «Добавить диапазоны», появятся два новых поля для добавления пользователем данных.QT: Как я могу динамически добавлять и удалять виджетов в макете?

enter image description here Нажмите «Удалить диапазоны», ничего не происходит, за исключением того, что кнопки визуально перемещаются вверх. Это говорит мне о том, что функция работает (вроде) и удаляет макет, но не относится к линиям и меткам.

Это две функции из программы, которую я разрабатываю. Я хочу, чтобы виджеты добавлялись и удалялись нажатием одной кнопки. Я попытался использовать deleteLater(), однако эта функция также попала в одну и ту же яму; фактически не удаляя lineEdits и метки. Это проблема не отсоединения перед удалением?

+0

Добавлен pyqt тег. Исправьте, если это неправильно (например, вы используете pyside, например). – hyde

ответ

1

использование этот способ. Он будет итеративно проходить через макет и deleteLater() каждого виджета в определенном макете. в этом случае self.all_ranges_layout

def del_ranges(self): 
    to_delete = self.all_ranges_layout.takeAt(self.all_ranges_layout.count() - 1) 
    if to_delete is not None: 
     while to_delete.count(): 
      item = to_delete.takeAt(0) 
      widget = item.widget() 
      if widget is not None: 
       widget.deleteLater() 
      else: 
       pass 

получить элемент компоновки при п-1 индекс
если есть объекты, которые будут удалены, продолжают
пока счетчик не 0
получить деталь макета на 0-й индекс
получите виджет в этом месте
если в этом виджете есть объект
удалить этот виджет

Смежные вопросы