Одинаковые сигналы, но для разных кнопок
У меня есть 2 набора из 3 кнопок, каждая с QDialogButtonBox() следующим образом:
- "Добавить" (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, Add / Remove / Clear - 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 ответ
Вы можете передать 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
метод.