2012-06-23 7 views
6

Jestem projektowania niestandardowych widżet, który jest w zasadzie QGroupBox trzyma konfigurowalną liczbę QCheckBox guziki, gdzie każdy z nich powinien kontrolować konkretny bit w maskę bitową reprezentowaną przez QBitArray. W tym celu, dodałem QCheckBox instancji do QButtonGroup, z każdego przycisku podany identyfikator całkowita:Podłączanie przeciążony sygnał pyqt stosując nowy styl składni

def populate(self, num_bits, parent = None): 
     """ 
     Adds check boxes to the GroupBox according to the bitmask size 
     """ 
     self.bitArray.resize(num_bits) 
     layout = QHBoxLayout() 

     for i in range(num_bits): 
      cb = QCheckBox() 
      cb.setText(QString.number(i)) 
      self.buttonGroup.addButton(cb, i) 
      layout.addWidget(cb) 
     self.setLayout(layout) 

Następnie każdy razem, gdy użytkownik będzie kliknij pole wyboru zawarte w self.buttonGroup , Chciałbym, aby self.bitArray był powiadamiany, aby odpowiedni bit w tablicy mógł zostać odpowiednio ustawiony/unsetowany. Do tego mam zamiar połączyć QButtonGroup nabuttonClicked (int) sygnał QBitArray natoggleBit (int) sposób i, być tak pythonic, jak to możliwe, chciałem użyć składni sygnałów nowego stylu, więc próbowałem to :

self.buttonGroup.buttonClicked.connect(self.bitArray.toggleBit) 

problemem jest to, że buttonClicked jest przeciążony sygnał, więc istnieje również buttonClicked (QAbstractButton *) podpis. W rzeczywistości, gdy program jest wykonywany otrzymuję ten błąd po kliknięciu pola wyboru:

The debugged program raised the exception unhandled TypeError 
"QBitArray.toggleBit(int): argument 1 has unexpected type 'QCheckBox'" 

który jasno pokazuje toggleBit metoda otrzymała buttonClicked (QAbstractButton *) sygnał zamiast buttonClicked (int) jeden.

Więc pytanie jest, w jaki sposób mogę określić połączenie sygnału, użyciu nowego stylu składni, tak że self.bitArray odbiera buttonClicked (int) sygnał zamiast domyślnego przeciążeniem - buttonClicked (QAbstractButton *)?

EDIT:PyQT's New-style Signal and Slot Support documentation stwierdza można użyć pyqtSlot dekoratorów aby określić, które sygnalizują chcesz podłączyć do danego gniazda, ale to jest za gniazdo jest tworzona. Co zrobić, gdy automat pochodzi z klasy "ready made"? Czy jest to jedyna możliwość jej podklasowania, a następnie ponowne zaimplementowanie danej szczeliny za pomocą odpowiedniego dekoratora?

Odpowiedz

16

Podczas przeglądania pokrewnych pytań znalazłem this answer, aby być dokładnie tym, czego potrzebowałem. Poprawna składnia sygnał nowy styl do podłączenia tylko QButtonGroup zabuttonClicked (int) sygnał QBitArray zatoggleBit (int), ignorując inne podpisy przeciążony, wiąże się z określeniem żądany typ w nawiasach, tak:

self.buttonGroup.buttonClicked[int].connect(self.bitArray.toggleBit) 
Powiązane problemy