从网格布局中删除最后一个小部件 [英] Delete last widget from gridlayout

查看:33
本文介绍了从网格布局中删除最后一个小部件的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有一个网格布局,我在运行时在其中添加了 Qlineedits.
按下按钮时,我想从 gridlaout 中删除最后一个 qline 编辑
为什么这个功能会同时删除所有的qlinedits?

I have a Grid layout in which I add Qlineedits at runtime.
while pushing the button I want to delete the last qline edit from the gridlaout
Why does this function delete all qlinedits at the same time ?

 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

如何更改代码一次只删除一个小部件,最好是最后添加的小部件?

How to change the code to only delete one widget at a time, preferably the last added widget ?

完整代码

#!/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_())

推荐答案

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

Your function removes all widgets because you are cycling through all the widgets, from the first to the last.

此外,实际上没有必要遍历整个布局,因为您已经保留了一个小部件列表,这些小部件列表总是将最后一个附加到最后.

Also, there is really no need to go through the whole layout, since you already keep a list of widgets that always appends the last one at the end.

只需从列表中弹出最后一项.不需要从布局中删除它,因为 deleteLater() 会处理它,但这只是为了演示目的.

Just pop out the last item from the list. Removing it from the layout shouldn't be necessary, as deleteLater() would take care of it, but that's just for demonstration purposes.

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

为了完整起见,您的函数应该完成以下操作:

For the sake of completeness, your function should have done the following:

  1. 在布局中循环小部件向后;
  2. 打破第一个(如最后一个)项目的循环;
  1. cycle the widgets through the layout backwards;
  2. break the cycle as soon as the first (as in last) item is found;

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 必须是一个实例属性):

Also, there's really no use in creating instance attributes (self.someobject = ...) for objects that don't need a persistent reference, especially if you are creating those objects repeatedly (which will result in a constant overwrite of that attribute, making it useless) and you already are keeping them in an persistent data model object (usually a list, a tuple, a dictionary) like self.mylist in your case (and that has to be an instance attribute):

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 和一般编程)在尝试做任何事情之前,必须被理解和内化.

Having seen your previous questions and comments, I strongly suggest you to better study and experiment with the Python data models, control flows and classes, as they are basic concepts (of Python and programming in general) that must be understood and internalized before attempting to do anything else.

这篇关于从网格布局中删除最后一个小部件的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆