相同的信号,但不同的按钮

时间:2017-02-21 22:42:25

标签: pyqt qpushbutton qt-signals

我有2组3个按钮,每个按钮都有一个QDialogBu​​ttonBox(),如下所示:

  • "添加" (AcceptRole)
  • "删除" (RejectRole)
  • "清除" (ResetRole)

类似的东西:

self.set1_btns = QtGui.QDialogButtonBox()
self.set1_btns.addButton("Add", QtGui.QDialogButtonBox.AcceptRole)
self.set1_btns.addButton("Remove", QtGui.QDialogButtonBox.RejectRole)
self.set1_btns.addButton("Clear", QtGui.QDialogButtonBox.ResetRole)

他们的角色大致相同,他们之间唯一的区别就是他们将添加/删除/清除他们已经分配的每个QListWidget'他们。

为简化起见,这些集合如下: (ListX - QListWidget,添加/删除/清除 - QPushButton)

  • Set1:List1,Add1,Remove1,Clear1
  • Set2:List2,Add2,Remove2,Clear2

这是我的代码:

def connect_signals(self):
    # List1 functions - Add, Remove, Clear
    self.set1_btns.accepted.connect(self.add_objects)
    self.set1_btns.rejected.connect(self.remove_objects)
    self.set1_btns.clicked.connect(self.clear_objects)

    # List2 functions - Add, Remove, Clear
    self.set2_btns.accepted.connect(self.add_objects)
    self.set2_btns.rejected.connect(self.remove_objects)
    self.set2_btns.clicked.connect(self.clear_objects)

def add_objects(self):
    selections = ['aaa', 'bbb', 'ccc']
    for sel in selections:
        # I can only define it to add to list1
        self.list1.addItem(sel)

def remove_objects(self):
    for item in self.list1.selectedItems():
        self.list1.takeItem(self.list1.row(item))

def clear_objects(self):
    # self.list1_btns are the QDialogButtons
    role = self.list1_btns.buttonRole(button)
    if role == QtGui.QDialogButtonBox.ResetRole:
        self.list1.clear()

我的问题是如何告诉我的函数告诉哪个按钮从哪个按钮点击到哪个按钮?

为了理智,我认为将它们组合成1个函数是理想的,因为它们的工作方式基本相同,而不是编写2个单独的函数,其中我所做的唯一更改将是QListWidget变量。

1 个答案:

答案 0 :(得分:2)

您可以将QListWidget个对象作为参数传递给这些方法,如下所示:

def connect_signals(self):
    # List1 functions - Add, Remove, Clear
    self.add1.accepted.connect(lambda: self.add_objects(self.list1))
    self.remove1.rejected.connect(lambda: self.remove_objects(self.list1))
    self.clear1.clicked.connect(lambda: self.clear_objects(self.list1))

    # List2 functions - Add, Remove, Clear
    self.add2.accepted.connect(lambda: self.add_objects(self.list2))
    self.remove2.rejected.connect(lambda: self.remove_objects(self.list2))
    self.clear2.clicked.connect(lambda: self.clear_objects(self.list2))

def add_objects(self, listWidget):
    selections = ['aaa', 'bbb', 'ccc']
    for sel in selections:
        # I can only define it to add to list1
        listWidget.addItem(sel)

def remove_objects(self, listWidget):
    for item in listWidget.selectedItems():
        listWidget.takeItem(listWidget.row(item))

def clear_objects(self, listWidget):
    # self.list1_btns are the QDialogButtons
    #role = self.list1_btns.buttonRole(button)
    #if role == QtGui.QDialogButtonBox.ResetRole:
    listWidget.clear()

其中lambda是一个由Python提供的匿名函数;信号连接到此匿名函数,该函数包含对您的方法的调用,将list1list2作为参数传递。然后相应地在方法中使用列表对象。

当您将clear按钮仅连接到clear方法时,我认为无需检查clear_objects按钮的作用。如果您确实要检查该角色,可以将self.list1_btnsself.list2_btns作为第二个参数传递给clear_objects方法。