我有2组3个按钮,每个按钮都有一个QDialogButtonBox(),如下所示:
类似的东西:
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)
这是我的代码:
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变量。
答案 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提供的匿名函数;信号连接到此匿名函数,该函数包含对您的方法的调用,将list1
或list2
作为参数传递。然后相应地在方法中使用列表对象。
当您将clear
按钮仅连接到clear
方法时,我认为无需检查clear_objects
按钮的作用。如果您确实要检查该角色,可以将self.list1_btns
和self.list2_btns
作为第二个参数传递给clear_objects
方法。