Удалить последний виджет из сетки - PullRequest
1 голос
/ 28 марта 2020

У меня есть макет Grid, в который я добавляю Qlineedits во время выполнения.
, нажимая кнопку, я хочу удалить последнее редактирование qline из сетки
Почему эта функция удаляет все qlinedits одновременно?

 def deleate_widgets(self):
        widgets = (self.main_layout.itemAt(i).widget() for i in range(self.main_layout.count()))
        for widget in widgets:
            if isinstance(widget, qtw.QLineEdit):
                print("linedit: %s  - %s" %(widget.objectName(), widget.text()))
                widget.deleteLater() # all objects

Как изменить код, чтобы удалить только один виджет за раз, предпочтительно последний добавленный виджет?

полный код

#!/usr/bin/env python

"""
Interface to get the specific  weight of each of the 5 containers
start_measurment_button starts thread /thread_worker
transfer_data button start query and send data to database
"""

import sys
import sqlite3

from PyQt5 import QtWidgets as qtw
from PyQt5 import QtCore as qtc
from PyQt5 import QtGui as qtg
from PyQt5 import QtSql as qsql

from  PyQt5 import sip

class AddWidget(qtw.QWidget):
    '''
    Interface with embedded SQL functions
    '''

    # Attribut Signal

    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        # your code will go here

        self.mylist = []
        # interface

        # position
        qtRectangle = self.frameGeometry()
        centerPoint = qtw.QDesktopWidget().availableGeometry().center()
        qtRectangle.moveCenter(centerPoint)
        self.move(qtRectangle.topLeft())
        # size
        self.resize(700, 410)
        # frame title
        self.setWindowTitle("add  Widget")
        # heading
        heading_label = qtw.QLabel('add Widget')
        heading_label.setAlignment(qtc.Qt.AlignHCenter | qtc.Qt.AlignTop)

        # add Button
        self.addwidget_button = qtw.QPushButton("add Widget")
        self.getlistof_button = qtw.QPushButton("deleate")

        self.main_layout = qtw.QGridLayout()
        self.main_layout.addWidget(self.getlistof_button,0,0)
        self.main_layout.addWidget(self.addwidget_button, 1, 0)

        self.setLayout(self.main_layout)

        self.show()

        # functionality
        self.addwidget_button.clicked.connect(self.add_widget)
        # self.getlistof_button.clicked.connect(self.deleate_widgets_try)


    def add_widget(self):
        self.my_lineedit = qtw.QLineEdit()
        self.mylist.append(self.my_lineedit)
        self.main_layout.addWidget(self.my_lineedit)


    def deleate_widgets(self):
        widgets = (self.main_layout.itemAt(i).widget() for i in range(self.main_layout.count()))
        for widget in widgets:
            if isinstance(widget, qtw.QLineEdit):
                print(widget)
                # print("linedit: %s  - %s" %(widget.objectName(), widget.text()))
                # widget.deleteLater() # alle objects


    # 
    # def deleate_widgets_try(self):
    #     widgets = (self.main_layout.itemAt(i).widget() for i in range(self.main_layout.count()))
    #     my_iter = iter(widgets)
    # 
    #     if isinstance(my_iter, qtw.QLineEdit):
    #         next(my_iter.deleteLater()) # alle objects)

if __name__ == '__main__':
    app = qtw.QApplication(sys.argv)
    w = AddWidget()
    sys.exit(app.exec_())

1 Ответ

0 голосов
/ 28 марта 2020

Ваша функция удаляет все виджеты, потому что вы циклически перебираете все виджетов, от первого до последнего.

Кроме того, в действительности нет необходимости go по всему макету, поскольку у вас уже есть список виджетов, который всегда добавляет последний в конце.

Просто вытащите последний элемент из списка. Удаление его из макета не должно быть необходимым, поскольку deleteLater() позаботится об этом, но это только для демонстрационных целей.

def deleate_widgets(self):
    # remove the last item from the list
    lastWidget = self.mylist.pop(-1)
    self.main_layout.removeWidget(lastWidget)
    lastWidget.deleteLater()

Ради полноты, ваша функция должна была сделать следующее :

  1. цикл виджетов по макету в обратном направлении ;
  2. прерывание цикл, как только первый (как в последний ) элемент найден;
def deleate_widgets(self):
    widgets = [self.main_layout.itemAt(i).widget() for i in range(self.main_layout.count())]
    # use reversed() to cycle the list backwards
    for widget in <b>reversed(widgets)</b>:
        if isinstance(widget, qtw.QLineEdit):
            print("linedit: %s  - %s" %(widget.objectName(), widget.text()))
            widget.deleteLater()
            # the line edit has been found, exit the cycle with break to avoid
            # deleting further widgets
            <b>break</b>

Кроме того, на самом деле нет смысла создавать атрибуты экземпляра (self.someobject = ...) для объектов, которые не нуждаются в постоянной ссылке, особенно если вы создавайте эти объекты повторно (что приведет к постоянной перезаписи этого атрибута, делая его бесполезным) и вы уже храните их в постоянном объекте модели данных (обычно это список, кортеж, словарь) как self.mylist в вашем случае (и , что должен быть атрибутом экземпляра):

def add_widget(self):
        # no need to create a "self.my_lineedit"
        <b>my_lineedit</b> = qtw.QLineEdit()
        self.mylist.append(my_lineedit)
        self.main_layout.addWidget(my_lineedit)

После просмотра ваших предыдущих вопросов и комментариев я настоятельно рекомендую вам лучше изучить и поэкспериментируйте с Python моделями данных , управляющими потоками и классами , так как они являются базовыми c концепциями (Python и программированием в целом) что необходимо понять и усвоить, прежде чем пытаться сделать что-нибудь еще.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...