从网格布局中删除最后一个小部件



我有一个网格布局,在运行时在其中添加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_())

您的函数会删除所有小部件,因为您正在从第一个到最后一个循环浏览所有小部件。

此外,实际上不需要遍历整个布局,因为您已经保留了一个小部件列表,该列表总是在最后添加最后一个。

只需弹出列表中的最后一项。从布局中删除它应该没有必要,因为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 inreversed(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(并且必须将作为实例属性(:

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数据模型、控制流和类,因为它们是基本概念(Python和编程的一般概念(,在尝试执行任何其他之前,必须理解和内化。

相关内容

最新更新