PySide:我怎么能触发当前点击的QPush按钮,而不是其他后来添加的

时间:2013-11-14 02:50:37

标签: python pyqt pyside signals-slots qpushbutton

我是PySide的新手。在我的程序中,我遇到了一个问题,当我单击一个按钮时,它会触发后来添加的其他按钮。谢谢!

    self.addContentButton = QtGui.QPushButton('Add')
    self.addContentButton.clicked.connect(self.addContent)

    def addContent(self):
    '''
        slot to add a row that include a lineedit, combobox, two buttons
    '''
        self.contentTabHBoxWdgt = QtGui.QWidget()

        self.contentName = QtGui.QLineEdit('line edit')

        self.conetentTypeBox = QtGui.QComboBox()
        self.conetentTypeBox.addItem('elem1')
        self.conetentTypeBox.addItem('elem2')

        self.contentSave = QtGui.QPushButton('save',parent = self.contentTabHBoxWdgt)
        self.contentSave.clicked.connect(self.contntSaveAct)

        self.contentDelete = QtGui.QPushButton('delete',parent=self.contentTabHBoxWdgt)
        self.contentDelete.clicked.connect(self.contntDel)

        self.contentTabHBox = QtGui.QHBoxLayout()
        self.contentTabHBox.addWidget(self.contentName)
        self.contentTabHBox.addWidget(self.conetentTypeBox)
        self.contentTabHBox.addWidget(self.contentSave)
        self.contentTabHBox.addWidget(self.contentDelete)

        self.contentTabHBoxWdgt.setLayout(self.contentTabHBox)

        self.contentTabVBox.addWidget(self.contentTabHBoxWdgt)

    def contntDel(self):
    '''
        slot to delete a row 
    '''
        msgBox = QtGui.QMessageBox(QtGui.QMessageBox.Warning, '', 'Be sure to delete')
        okBttn = msgBox.addButton('Yes', QtGui.QMessageBox.AcceptRole)
        noBttn = msgBox.addButton('Cancel', QtGui.QMessageBox.RejectRole)
        ret = msgBox.exec_()
        if msgBox.clickedButton() == okBttn:
            self.contentTabVBox.removeWidget(self.contentDelete.parentWidget());

当我添加一行并单击其删除按钮时,它无法正常工作。虽然我添加了两行或三行,但我单击一个删除按钮,它会删除一行不是所单击的删除按钮所属的行。我怎么能实现这个功能。 THS!

1 个答案:

答案 0 :(得分:1)

你的问题是因为你没有真正正确地利用面向对象的编程。

示例中的所有行都调用方法contntDel的相同实例。此方法使用self.contentDelete,它始终包含对添加的最后一行的引用。

您需要做的是将与行相关的所有内容分离到新类。添加行时,请创建此类的新实例并传入contentTabVBox。这样,每一行(或您将要编写的新类的实例)都将拥有自己的删除方法。

如果没有完整的代码示例,我无法提供完整的解决方案,但这应该会给您一个粗略的想法:

class MyRow(object):
    def __init__(self,contentTabVBox, rows):
        self.contentTabVBox = contentTabVBox
        self.my_list_of_rows = rows
        self.addContent()

    def addContent(self):
        # The code for your existing addContent method here

    def contntDel(self):
        # code from your existing contntDel function here
        # also add (if Ok button clicked):
            self.my_list_of_rows.remove(self)

class MyExistingClass(??whatever you have here normally??):
    def __init__(....):
        self.addContentButton = QtGui.QPushButton('Add')
        self.addContentButton.clicked.connect(self.addContent)
        self.my_list_of_rows = []

    def addContent(self):
        my_new_row = MyRow(self.contentTabVBox,self.my_list_of_rows)
        # You mustsave a reference to my_new_row in a list or else it will get garbage collected.
        self.my_list_of_rows.append(my_new_row)

希望有所帮助!