Ny stil Signal og Slot Support

Denne delen beskriver den nye stilen til tilkoblingssignaler og spor som introduseres i PyQt v4.5.

En av hovedtrekkene til Qt er bruken av signaler og spor for a kommunisere mellom objekter. Deres bruk oppmuntrer til utvikling av gjenbrukbare komponenter.

Et signal sendes ut nar noe av potensiell interesse skjer. Et spor er en Python callable. Hvis et signal er koblet til et spor, blir spalten kalt nar signalet sendes ut. Hvis et signal ikke er tilkoblet, skjer ingenting. Koden (eller komponenten) som sender ut signalet, vet ikke eller bryr seg om signalet blir brukt.

Signal / spalte mekanismen har folgende funksjoner.

Et signal kan v re koblet til mange spor. Et signal kan ogsa kobles til et annet signal. Signalargumenter kan v re en hvilken som helst Python-type. Et spor kan v re koblet til mange signaler. Tilkoblinger kan v re direkte (dvs. synkron) eller i ko (dvs. asynkron). Tilkoblinger kan gjores pa tvers av trader. Signaler kan kobles fra.

Ubundne og bundet signaler

Et signal (spesielt et ubundet signal) er et attributt for en klasse som er en underklasse av QObject. Nar et signal refereres som et attributt til en forekomst av klassen, binder PyQt automatisk forekomsten til signalet for a opprette et bundet signal. Dette er den samme mekanismen som Python selv bruker for a skape bundne metoder fra klassefunksjoner.

Et bundet signal har connect (), disconnect () og emit () metoder som implementerer den tilknyttede funksjonaliteten. Det har ogsa et signalattributt som er signaturen til signalet som skulle returneres av Qt’s SIGNAL () makro.

Et signal kan v re overbelastet, dvs. Et signal med et bestemt navn kan stotte mer enn en signatur. Et signal kan bli indeksert med en signatur for a velge den nodvendige. En signatur er en sekvens av typer. En type er enten en Python-typeobjekt eller en streng som heter C ++-typen.

Hvis et signal er overbelastet, vil det ha en standard som vil bli brukt hvis ingen indeks er gitt.

Nar et signal utloses, konverteres eventuelle argumenter til C ++-typer om mulig. Hvis et argument ikke har en tilsvarende C ++-type, blir den pakket inn i en spesiell C ++-type som gjor at den kan sendes rundt Qt’s meta-type system, samtidig som det sikres at referansenummeret er riktig vedlikeholdt.

Definere nye signaler med pyqtSignal () �

PyQt definerer automatisk signaler for alle Qt ‘s innebygde signaler. Nye signaler kan defineres som klasseattributter ved bruk av pyqtSignal () fabrikken.

Opprett en eller flere overbelastede ubundne signaler som en klassetributt.

typer & # 8211; de typene som definerer signalets C + + signatur. Hver type kan v re en Python-typeobjekt eller en streng som heter C ++-typen. Alternativt kan hver v re en sekvens av type argumenter. I dette tilfellet definerer hver sekvens signaturen til en annen signaloverbelastning. Den forste overbelastningen er standard. navn & # 8211; navnet pa signalet. Hvis den utelates, brukes navnet pa klassetributtet. Dette kan bare gis som et sokeord-argument.

et ubundet signal.

Folgende eksempel viser definisjonen av en rekke nye signaler:

Nye signaler bor bare defineres i underklasser av QObject.

Nye signaler definert pa denne maten blir automatisk lagt til i klassens QMetaObject. Dette betyr at de vil vises i Qt Designer og kan bli introspected ved hjelp av QMetaObject API.

Overbelastede signaler skal brukes med forsiktighet nar et argument har en Python-type som ikke har en tilsvarende C ++-type. PyQt bruker den samme interne C ++-klassen til a representere slike objekter, og det er derfor mulig a ha overbelastede signaler med forskjellige Python-signaturer som implementeres med identiske C ++-signaturer med uventede resultater. Folgende er et eksempel pa dette:

Koble til, koble fra og sende ut signaler

Signaler er koblet til spor ved hjelp av connect () -metoden til et bundet signal.

Koble et signal til et spor. Et unntak vil bli hevet dersom tilkoblingen mislyktes.

spor & # 8211; sporet for a koble til, enten et Python-nummer eller et annet bundet signal. skriv & # 8211; hvilken type tilkobling du skal lage.

Signaler er koblet fra spor ved hjelp av disconnect () -metoden til et bundet signal.

Koble fra en eller flere spor fra et signal. Et unntak vil bli hevet hvis sporet ikke er koblet til signalet eller hvis signalet ikke har noen tilkoblinger i det hele tatt.

Signaler sendes fra a bruke emit () -metoden til et bundet signal.

Folgende kode viser definisjon, tilkobling og utgivelse av et signal uten argumenter:

Folgende kode viser tilkoblingen av overbelastede signaler:

Koble til signaler ved hjelp av sokeordargumenter

Det er ogsa mulig a koble signaler ved a sende et spor som et sokeordargument som svarer til navnet pa signalet nar du oppretter et objekt, eller ved hjelp av metoden pyqtConfigure () for QObject. For eksempel er de folgende tre fragmentene ekvivalente:

Den pyqtSlot () Decorator�

Selv om PyQt tillater at Python kalles til a bli brukt som spor ved tilkobling av signaler, er det noen ganger nodvendig a markere en Python-metode eksplisitt som en Qt-spor og for a gi en C ++-signatur for den. PyQt gir pyqtSlot () -funksjonen dekoratoren til a gjore dette.

Dekorer en Python-metode for a lage et Qt-spor.

typer & # 8211; de typene som definerer spaltens C ++-signatur. Hver type kan v re en Python-typeobjekt eller en streng som heter C ++-typen. navn & # 8211; navnet pa sporet som vil bli sett av C ++. Hvis utelatt navnet pa Python-metoden blir dekorert, vil det bli brukt. Dette kan bare gis som et sokeord-argument. resultat & # 8211; typen av resultatet og kan v re en Python-typeobjekt eller en streng som spesifiserer en C ++-type. Dette kan bare gis som et sokeord-argument.

Koble et signal til en dekorert Python-metode har ogsa fordelen av a redusere mengden minne som brukes og er litt raskere.

Det er ogsa mulig a kjede dekoratorene for a definere en Python-metode flere ganger med forskjellige signaturer. For eksempel:

Koble til spor ved navn �

PyQt stotter funksjonen QtCore.QMetaObject.connectSlotsByName () som vanligvis brukes av pyuic4 generert Python-kode for automatisk a koble signaler til spor som samsvarer med en enkel navngivningskonvensjon. Men hvor en klasse har overbelastede Qt-signaler (dvs. med samme navn, men med forskjellige argumenter), trenger PyQt tilleggsinformasjon for automatisk a koble til riktig signal.

For eksempel har QtGui.QSpinBox-klassen folgende signaler:

Nar verdien av spin-boksen endres, vil begge signalene bli sendt ut. Hvis du har implementert et spor som heter on_spinbox_valueChanged (som antar at du har gitt QSpinBox-forekomsten navnet-boksen), vil den bli koblet til begge variasjoner av signalet. Derfor, nar brukeren endrer verdien, blir sporet ditt kalt to ganger – en gang med et heltallargument, og en gang med et unicode- eller QString-argument.

Dette skjer ogsa med signaler som tar valgfrie argumenter. Qt implementerer dette ved hjelp av flere signaler. For eksempel har QtGui.QAbstractButton folgende signal:

Qt implementerer dette som folgende:

PyqtSlot () dekoratoren kan brukes til a spesifisere hvilken av signalene som skal kobles til sporet.

For eksempel, hvis du bare var interessert i heltallvarianten av signalet, sa vil spordefinisjonen din se ut som folgende:

Hvis du onsket a handtere begge varianter av signalet, men med forskjellige Python-metoder, kan dine spordefinisjoner se ut som folgende:

Folgende viser et eksempel ved a bruke en knapp nar du ikke er interessert i det valgfrie argumentet:

Blir ny stil og gammelstilstilkoblinger �

Implementeringen av nystilstilkoblinger er litt annerledes enn implementeringen av gamle stilstilkoblinger. En applikasjon kan fritt bruke begge stilene, med forbehold om at noen enkelt nystilstilkobling bare skal kobles fra ved hjelp av den nye stilen. Pa samme mate bor en hvilken som helst individuell gammelstilkobling kun kobles fra ved hjelp av den gamle stilen.

Du bor ogsa v re oppmerksom pa at pyuic4 genererer kode som bruker gammelstilstilkoblinger.

Innholdsfortegnelse.

Forrige emne.

Neste emne.

Raskt sok.

Skriv inn sokeord eller en modul, klasse eller funksjonsnavn.