0

我正在学习 PyQt4(我使用的是 4.4.4 版),而且我对 Python(Python 2.5)还很陌生。我有一个带有 QListWidget 和 QPushButton 的 GUI。我希望用户能够单击以选择列表中的条目,然后单击 QPushButton 并使所选条目消失(从 QList 中删除)。一个多星期以来,我一直在努力解决这个问题,我将非常感谢一些帮助。

目前,我的 GUI 出现了,我可以选择不同的列表项(现在一次只能选择一个),但是当我单击 QPushButton 时,什么也没有发生。选择颜色从蓝色变为灰色,但不会删除条目。命令提示符 (Windows 7) 中未显示错误。

我已经定义了一个函数 remove(),我将它用作 QPushButton 的插槽。我相信 QPushButton.connect 是为 Qt Signal to Python Slot 正确定义的,基于我所看到的类似问题的答案,但这些项目没有被删除。但是,删除功能甚至没有被触发。我在函数中有一个打印语句,但是当我单击 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())

...

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

4

1 回答 1

1

你混合了信号:

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

deleteButton是 a QPushButton,但itemClicked(clicked) 看起来像是来自QListWidget签名错误的信号。因为,QPushButton没有这个信号,所以没有建立连接。Qt 不会为失败的连接引发错误,但.connect方法有一个bool返回值,指示尝试连接的成功/失败。

此外,lambda: self.remove作为一个插槽没有意义。Slot 应该是在信号发射时调用的可调用对象。当然,lambda创建一个函数,但你所做的只是引用方法self.removelambda会叫,self.remove不会。就像self.remove一个插槽就足够了。

您应该使用按钮的clicked()信号(或者clicked(bool),如果您关心checked值):

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

编辑

另一个问题:你的remove方法没有达到你想要的效果。removeItemWidget不会删除item,它会删除item的小部件(如果您设置了一个)。它与setItemWidget.

您应该使用takeItem删除项目。

def remove(self):
    self.qList.takeItem(self.qList.currentRow())
于 2013-04-04T00:26:01.680 回答