PyQt4:使用QPushButton小部件从QList小部件中删除项目

时间:2013-04-02 21:33:55

标签: user-interface pyqt4 python-2.5 qlistwidget qpushbutton

我正在学习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())

...

我试图张贴图片,但我没有足够的声誉。如果您认为图像有用,请告诉我,我可以将其发送给您。

1 个答案:

答案 0 :(得分:1)

你混合了信号:

deleteButton.connect(deleteButton,QtCore.SIGNAL('itemClicked(clicked)'),lambda: self.remove)

deleteButtonQPushButton,但itemClicked(clicked) 看似来自QListWidget的签名错误的信号。由于QPushButton没有此信号,因此不进行任何连接。 Qt不会引发连接失败的错误,但.connect方法的返回值为bool,表示尝试连接成功/失败。

此外,lambda: self.remove作为一个插槽没有意义。插槽应该是可调用的,在信号发出时调用。当然,lambda创建了一个函数,但您所做的只是引用方法self.remove。将调用lambdaself.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())