Одинаковые сигналы, но для разных кнопок

У меня есть 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 метод.

Другие вопросы по тегам