从gridlayout删除最后一个小部件

问题描述 投票:1回答:1

我有一个网格布局,可以在运行时在其中添加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_())
python pyqt pyqt5
1个回答
0
投票

您的函数将删除所有小部件,因为您are从第一个到最后一个遍历all个小部件。

此外,实际上您不需要遍历整个布局,因为您已经保留了始终在末尾追加最后一个小部件的列表。

只需从列表中弹出最后一项。不必从布局中删除它,因为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. 使小部件循环通过布局backwards;
  2. break一旦找到第一个(如在[[last中)项目,就循环;
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 reversed(widgets): 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 break
而且,实际上不需要为不需要持久引用的对象创建实例属性(self.someobject = ...),特别是如果您反复创建这些对象(这将导致该属性不断被覆盖,从而使其无法使用) 

您已经将它们保存在持久性数据模型对象(通常是列表,元组,字典)中,例如self.mylist(并且that必须是实例属性) :def add_widget(self): # no need to create a "self.my_lineedit" my_lineedit = qtw.QLineEdit() self.mylist.append(my_lineedit) self.main_layout.addWidget(my_lineedit)
[已经看过您以前的问题和评论,强烈建议您更好地研究和试验Python data modelscontrol flowsclasses,因为它们是(Python和一般编程的)基本概念,

必须理解并内化,然后再尝试进行[[anything

其他。
© www.soinside.com 2019 - 2024. All rights reserved.