Python PySide:我如何触发当前点击的QPushbutton,而不是其他后来添加的按钮

Python PySide:我如何触发当前点击的QPushbutton,而不是其他后来添加的按钮,python,pyqt,pyside,signals-slots,qpushbutton,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 lineed

我是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());

当我添加一行并单击其“删除”按钮时,它不会按预期工作。当我添加两行或三行时,我单击一个“删除”按钮,它会删除一行,该行不是单击的“删除”按钮所属的行。我怎样才能实现这个功能。这些

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

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

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

如果没有完整的代码示例,我无法提供完整的解决方案,但这会让您大致了解:

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)

希望有帮助

你说的触发另一个按钮是什么意思?第一个不点火,还是两个都点火?你能添加更多细节吗?哦,假设我添加三行,如果我单击第一行的contentDelete按钮,它会触发删除最后一行,而不是第一行。谢谢!这对我很有效!我在一节课上写了所有的代码!