每次点击“添加项目...”按钮后,我想要一行(标签,按钮)附加到布局(在同一个按钮下面)。
因此,它应该每次点击添加一行。
问题是它增加了以下内容:
第一次点击:添加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函数)也会帮助我。
我希望我解释得很好,你得到了我正在做的事情......
任何帮助将不胜感激。提前致谢
答案 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()