我是PyQt的新手,遇到了一个相当困难(对我而言)的问题。
我有一个QVBoxLayout。我用几个QHBoxLayout动态填充它。 每个QHBoxLayout主机,按此顺序,3个QLineEdit,1个QLabel和1个QPushButton。
def add_malt(self):#call when clicking on a push button
maltT=self.s[str(self.malt_list_widget.currentItem().text())]
self.listMalts.append(maltT)
h_layout=QtGui.QHBoxLayout()#create an horizontal layout to host widgets for one malt line
h_layout.addWidget(QtGui.QLineEdit(maltT.full_name))#for grain full name
h_layout.addWidget(QtGui.QLineEdit())#for percentage
h_layout.addWidget(QtGui.QLineEdit())#for calculated mass
h_layout.addWidget(QtGui.QLabel('kg'))#for unit
h_layout.addWidget(QtGui.QPushButton('X')) #for deletion
h_layout.itemAt(0).widget().setMinimumSize(400,30)
h_layout.itemAt(0).widget().setStyleSheet("font-size: 14px;background-color: rgb(230, 230, 230);")
h_layout.itemAt(0).widget().setReadOnly(True)
h_layout.itemAt(1).widget().setMaximumSize(50,30)
h_layout.itemAt(1).widget().setStyleSheet("font-size: 14px;background-color: white;")
h_layout.itemAt(1).widget().textEdited.connect(self.clean_results)
h_layout.itemAt(2).widget().setMaximumSize(70,30)
h_layout.itemAt(2).widget().setStyleSheet("font-size: 14px;background-color: rgb(230,230,0) ;")
h_layout.itemAt(2).widget().setReadOnly(True)
h_layout.itemAt(3).widget().setMaximumSize(50,30)
h_layout.itemAt(3).widget().setStyleSheet("font-size: 14px;")
h_layout.itemAt(4).widget().setMaximumSize(30,30)
h_layout.itemAt(4).widget().setStyleSheet("font-size: 14px;color: 'red';background-color: rgb(230,230,230);font-weight: bold; ")
h_layout.itemAt(4).widget().clicked.connect(self.remove_malt)
self.grainLayout.addLayout(h_layout)
def remove_malt(self):
s= self.sender()
for i in range(self.grainLayout.count()):
#if i==0:
# continue
print('loop '+str(i))
#pb=self.grainLayout.itemAt(i).layout().itemAt(4).widget()
ly=self.grainLayout.itemAt(i).layout()
print ('voici ly')
print (ly)
pb=ly.itemAt(4).widget()
if s ==pb:
print('delete '+str(i))
self.clearLayout(self.grainLayout.itemAt(i).layout())
del self.listMalts[i]
return
def clearLayout(self,layout):
print(layout)
if layout is not None:
while layout.count():
item = layout.takeAt(0)
widget = item.widget()
if widget is not None:
widget.deleteLater()
else :
self.clearLayout(item.layout())
包装QVBoxLayout称为grainLayout,上面的文本不是它的一部分。 我为了能够打印ly(布局)的值而自动打破了行#`pb = self.grainLayout.itemAt(i).layout()。itemAt(4).widget()。 PB。
我可以删除一些行(QHBoxLayout),但是在某个时刻,某个时候在最后一个,其他时间在一个随机位置,会发生错误。 这是控制台的内容
loop 0
voici ly
<PyQt4.QtGui.QHBoxLayout object at 0x7faef91e06d8>
delete 0
<PyQt4.QtGui.QHBoxLayout object at 0x7faef91e06d8>
loop 0
voici ly
<PyQt4.QtGui.QHBoxLayout object at 0x7faef91e06d8>
Traceback (most recent call last):
File "/home/jaaf/beer/MassCalculationWindow.py", line 122, in remove_malt
pb=ly.itemAt(4).widget()
AttributeError: 'NoneType' object has no attribute 'widget'
第122行是评估pb的行
读到这一点,似乎在pb的那一刻'NonType对象没有属性'widget'ly与之前的对象完全相同,我的意思是QHBoxLayout。
拜托,我需要帮助。
答案 0 :(得分:0)
在您的代码中,除了删除小部件之外,您还必须删除这些项目,同时验证该项目是否存在。
备注:if obj is not None:
等于if obj:
def remove_malt(self):
s= self.sender()
for i in range(self.grainLayout.count()):
item =self.grainLayout.itemAt(i)
if item:
if s == item.layout().itemAt(4).widget():
self.clearLayout(item.layout())
self.grainLayout.removeItem(item)
del self.listMalts[i]
return
def clearLayout(self, layout):
if layout:
while layout.count():
item = layout.takeAt(0)
widget = item.widget()
if widget:
widget.deleteLater()
else :
self.clearLayout(item.layout())
layout.removeItem(item)