Een overbelast PyQT-signaal verbinden met syntaxis in nieuwe stijl

Ik ontwerp een aangepaste widget die in feite een QGroupBox is met een configureerbaar aantal QCheckBox knoppen, waar elk een bepaald bit moet besturen in een bitmask vertegenwoordigd door een < a href = "http://www.riverbankcomputing.co.uk/static/Docs/PyQt4/html/qbitarray.html" rel = "noreferrer"> QBitArray . Om dit te doen, heb ik de instanties QCheckBox toegevoegd aan een QButtonGroup , waarbij elke knop een integer ID heeft gekregen:

    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)

Elke keer dat een gebruiker op een selectievakje in self.buttonGroup klikt, wil ik dat self.bitArray een melding krijgt zodat het overeenkomstige bit in de array kan worden dienovereenkomstig in-/uitschakelen. Daarvoor was ik van plan het QButtonGroup -knopClicked (int) -signaal te verbinden met QBitArray's toggleBit (int) -methode en, om zo pythonisch mogelijk zijn, wilde ik syntaxis van nieuwe stijlsignalen gebruiken, dus probeerde ik dit:

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

Het probleem is dat buttonClicked een overbelast signaal is, dus er is ook de buttonClicked (QAbstractButton *) handtekening. Wanneer het programma wordt uitgevoerd, krijg ik deze foutmelding wanneer ik op een selectievakje klik:

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

die duidelijk de toggleBit -methode toont, ontving het -knopClicked (QAbstractButton *) -signaal in plaats van de -knopClicked (int) één.

Dus de vraag is, hoe kan ik de signaalverbinding opgeven, met behulp van syntaxis in nieuwe stijl , zodat self.bitArray de knop krijgtClicked (int) signal in plaats van de standaard overbelasting - knop Klik (QAbstractButton *) ?

EDIT: The PyQT's New-style Signal and Slot Support documentation states you can use pyqtSlot decorators to specify which signal you want to connect to a given slot, but that is for a slot you are creating. What to do when the slot is from a "ready made" class? Is the only option subclassing it and then reimplementing the given slot with the right decorator?

6

1 antwoord

Tijdens het bladeren naar gerelateerde vragen vond ik dit antwoord precies wat ik nodig had. De juiste syntaxis van de nieuwe stijl voor het verbinden van QButtonGroup's -knopClicked (int) -signaal naar QBitArray's toggleBit (int) , negerend de andere overbelaste handtekeningen, houdt het specificeren van het gewenste type tussen haakjes, zoals deze:

self.buttonGroup.buttonClicked[int].connect(self.bitArray.toggleBit)
16
toegevoegd