0

每次单击“添加项目...”按钮后,我希望将一行(标签,按钮)附加到布局(在同一按钮下方)。

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

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

第一次点击:添加 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 函数)也可以帮助我。

我希望我解释得很好,你得到我想要做的......

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

4

1 回答 1

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()
于 2013-07-23T23:06:38.020 回答