布局没有正确添加,似乎它没有删除以前的小部件

时间:2013-07-23 13:09:36

标签: python qt layout widget pyside

每次点击“添加项目...”按钮后,我想要一行(标签,按钮)附加到布局(在同一个按钮下面)。

因此,它应该每次点击添加一行。

问题是它增加了以下内容:

第一次点击:添加1行(总项目行数= 1)(正确)

第二次点击:添加了2行(总项目行数= 3)(应为2)

第三次点击:添加了3行(总项目行数= 6)(应为3)

以下是相关代码:

from PySide import QtCore
from PySide import QtGui

import sys

class Form(QtGui.QDialog):

    items = []
    def __init__(self, parent = None):
        super(Form, self).__init__(parent)

        self.btn = QtGui.QPushButton("Add Item...")
        self.btn.clicked.connect(self.item_toggle)

        self.layout = self.initial_view()
        self.setLayout(self.layout)

    def item_toggle(self, add = True):
        layout = self.layout

        if add:
            string = ("25468 5263.35 54246") #####random text
            self.items.append(string)

        for item in self.items:
            rem_btn = QtGui.QPushButton("X")
            rem_btn.clicked.connect(self.remove_item)
            layout.addRow(item, rem_btn)

        self.setLayout(layout)

    def remove_item(self, ):
        #self.items.pop() #something to delete that item
        self.add_item("False")  #redraw items part

    def initial_view(self, ):
        layout = QtGui.QFormLayout()
        #adding to layout
        layout.addRow(self.btn)
        return layout

app = QtGui.QApplication(sys.argv)
form = Form()
form.show()
app.exec_()

我认为它没有删除以前的小部件,但我无法安静地弄清楚它。另外,删除项目的方法(remove_item函数)也会帮助我。

我希望我解释得很好,你得到了我正在做的事情......

任何帮助将不胜感激。提前致谢

1 个答案:

答案 0 :(得分:1)

要防止在列表中添加其他项目,只需删除for循环,然后执行以下操作:

rem_btn = QtGui.QPushButton("X")
rem_btn.clicked.connect(self.remove_item)
layout.addRow(string, rem_btn)

关于addRow调用您需要了解的是,这会在第二列中添加QPushButton,并为第一列自动创建QLabel。因此,当您想要删除该行时,您必须同时删除该按钮和标签。

现在关于删除。我想最简单的方法是找出要删除的按钮。

 sending_button = self.sender() 

此时您需要访问QLabel。幸运的是,在布局上调用了一个名为labelForField的调用,它将返回与QPushButton关联的QLabel

labelWidget = self.layout.labelForField(sending_button)

然后删除实际的小部件

sending_button.deleteLater()
if labelWidget:
   labelWidget.deleteLater()