Как следует из названия, deleteLater()
удаляет объект позже .
Планирует удаление этого объекта.
объект будет удален , когда управление вернется к событию l oop.
Если вы добавите print(self.main_layout.count())
после каждого вызова deleteLater
в цикле, вы будете убедитесь, что счетчик все тот же, и это потому, что элемент управления еще не возвращен событию l oop.
Вы должны использовать layout.removeWidget()
вместо этого.
Кроме того, этого все равно будет недостаточно.
Вы перебираете весь список, пока не найдете последний элемент, но это означает, что следующий за последним будет не проверить. Возможным решением было бы сделать цикл for дважды , но сделать это было бы не самым умным занятием.
Итак, , как я уже предлагал , вы должны использовать reversed()
. Кроме того, вам нужна некоторая форма контроля, так как вы собираетесь удалить два виджета, в противном случае цикл прервется, как только он найдет первое совпадение для isinstance
.
def deleate_lastlineedit(self):
labelRemoved = editRemoved = False
widgets = [self.main_layout.itemAt(i).widget() for i in range(self.main_layout.count())]
for widget in reversed(widgets):
if isinstance(widget, qtw.QLineEdit):
editRemoved = True
elif isinstance(widget, qtw.QLabel):
labelRemoved = True
else:
continue
# in this case, removeWidget is not necessary, since we're not
# checking the count, but I'll leave it anyway for completeness;
self.main_layout.removeWidget(widget)
widget.deleteLater()
if editRemoved and labelRemoved:
break
Так как вам нужно только удалить последние виджеты, создание генератора для целых виджетов не требуется. Пока вы всегда вставляете только QLabels и QLineEdits в конце макета, вы можете просто использовать некоторое время l oop.
def deleate_lastlineedit(self):
labelRemoved = editRemoved = False
while not (labelRemoved and editRemoved):
widget = self.main_layout.itemAt(self.main_layout.count() - 1).widget()
# now here removeWidget *IS* required, otherwise the while loop will
# never exit
self.main_layout.removeWidget(widget)
widget.deleteLater()
if isinstance(widget, qtw.QLineEdit):
editRemoved = True
elif isinstance(widget, qtw.QLabel):
labelRemoved = True
PS: Я уже предложил вам лучше изучить Python управляющих потоков , пожалуйста, следуйте моему совету: это ваш ЧЕТВЕРТЫЙ вопрос почти с той же проблемой, и Я ответил только потому, что хотел прояснить проблему deleteLater()
, но вам даже не нужно было бы ее спрашивать, если бы вы следовали моим предыдущим предложениям и ответам. Пожалуйста, делайте изучайте и практикуйтесь, вы не можете ожидать кодирования GUI, если вы даже не понимаете самых элементарных основ его языка .