我正在学习PyQt4(我使用的是4.4.4版本),而且我对Python(Python 2.5)很陌生。我有一个带有QListWidget和QPushButton的GUI。我希望用户能够单击以选择列表中的条目,然后单击QPushButton并使所选条目消失(从QList中删除)。我一直在打击这个问题超过一个星期,我非常感谢你的帮助。
目前,我的GUI出现了,我可以选择不同的列表项目(现在一次只能选择一个),但是当我点击QPushButton时,没有任何反应。选择颜色从蓝色变为灰色,但不删除该条目。命令提示符(Windows 7)中未显示错误。
我已经定义了一个函数remove(),我将其用作QPushButton的插槽。我相信QPushButton.connect是根据我所看到的类似问题的答案而正确定义的Qt信号到Python插槽,但这些项目没有被删除。但是,甚至没有触发删除功能。我在函数中有一个print语句,但是当我单击QPushButton时它没有被调用,这就是我知道函数没有被调用的方式。
这是我最近的代码:(我在关于大块代码的meta-SO上阅读了一篇非常蹩脚的帖子,所以我把它减少到我认为相关的位:列表创建,按钮创建和删除功能,我正在尝试将其用作插槽。我在评论中留下了指示其他部分的内容,所以如果您认为我遗漏了可能有用的内容,请告诉我,我将它添加回来)
class questionGUI(QtGui.QWidget):
#This class is the window of the gui.
def __init__(self):
super(questionGUI,self).__init__()
#Layout
grid = QtGui.QGridLayout()
grid.setSpacing(10)
#Labels Needed
...
#Question List
self.qList = QtGui.QListWidget()
#print self.qList
self.qList.setSelectionMode(QtGui.QAbstractItemView.SingleSelection)
entries = ['[Pick Image] <Default>','[Slider Question] <Default>', '[Comment Box] <Default>']
for i in entries:
item = QtGui.QListWidgetItem(i)
self.qList.addItem(item)
#Type select
...
#Text insert Needed
...
#Buttons Needed
deleteButton = QtGui.QPushButton('Delete Question')
deleteButton.connect(deleteButton,QtCore.SIGNAL('itemClicked(clicked)'),lambda: self.remove)
addQuestionButton = QtGui.QPushButton('Add Question')
...
doneButton = QtGui.QPushButton('Done')
...
#Parameters Needed
...
#Layout Placement and Window dimensions
...
def addQuestion(self):
...
def remove(self):
print 'remove triggered'
print self.qList.currentItem()
self.qList.removeItemWidget(self.qList.currentItem())
...
我试图张贴图片,但我没有足够的声誉。如果您认为图像有用,请告诉我,我可以将其发送给您。
答案 0 :(得分:1)
你混合了信号:
deleteButton.connect(deleteButton,QtCore.SIGNAL('itemClicked(clicked)'),lambda: self.remove)
deleteButton
是QPushButton
,但itemClicked(clicked)
看似来自QListWidget
的签名错误的信号。由于QPushButton
没有此信号,因此不进行任何连接。 Qt不会引发连接失败的错误,但.connect
方法的返回值为bool
,表示尝试连接成功/失败。
此外,lambda: self.remove
作为一个插槽没有意义。插槽应该是可调用的,在信号发出时调用。当然,lambda
创建了一个函数,但您所做的只是引用方法self.remove
。将调用lambda
,self.remove
不会。只需self.remove
作为一个插槽即可。
您应该从按钮使用clicked()
信号(或clicked(bool)
,如果您关心checked
值):
deleteButton.connect(deleteButton, QtCore.SIGNAL('clicked()'), self.remove)
修改强>
另一个问题:您的remove
方法无法执行您想要的操作。 removeItemWidget
未删除项,它会删除 项目中的小部件(如果您设置了一个)。它与setItemWidget
相对应。
您应该使用takeItem
删除项目。
def remove(self):
self.qList.takeItem(self.qList.currentRow())