2017-02-21 28 views
0

у меня есть 2 комплекта из 3 кнопок, каждая из которых с QDialogButtonBox() следующим образом:Те же сигналы, но на разные кнопки

  • "Добавить" (AcceptRole)
  • "Удалить" (RejectRole)
  • "Clear" (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 функции, поскольку они работают примерно одинаково, вместо того, чтобы писать две отдельные функции, в которых единственными внесенными мной изменениями будут переменная QListWidget.

ответ

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.

+0

Прошу игнорировать мое сообщение .. Это на самом деле работает. Да, изначально я подключал метод 'clear' к кнопке' clear' – dissidia

+0

Просто быстрый вопрос: возможно ли, что кнопки 'add' из набора 2 инстинктивно знают друг друга? Например. если я добавлю «itemA» в список1, когда я нажимаю кнопку добавления для set2, list2 не следует добавлять «itemA», потому что он уже находится в списке1 – dissidia

+0

Я только понял, что этот код уничтожит любые новые дополнения, если я попытаюсь добавить любые новые объекты. Например. Если список уже содержит 3 объекта, и я попытался добавить еще один новый объект, объекты в списке были уничтожены, и теперь список будет содержать только этот «новый» единственный объект, возможно, только из-за использования .clicked.connect – dissidia