Slots qwidget

Innholdsfortegnelse.

[frafile: qobject.xml id: qobject]

QObject er grunnklassen for mange av de viktige klassene i Qt-biblioteket, for eksempel QEvent, QApplication, QLayout og QWidget. Et QObject kan ha en forelder og barn, og gir en annen implementering av komposittmonsteret. Det kan bruke signaler og spor, en implementering av Observer-monsteret, for a kommunisere med andre QObjects. QObjects gjor det mulig a foreta hendelsesbasert programmering, som bruker QApplication og Qts eventlokke.

En viktig klasse a bli kjent med er QObject, den hvorfra alle QWidget s (og mange andre klasser) er avledet. Vi refererer til ethvert objekt av en klasse som er avledet av QObject som et QObject. Folgende er et forkortet titt pa definisjonen.

QObject har ikke en offentlig kopi konstruktor eller kopi oppdrag operator. Ned mot slutten av klassedisisjonen er det en makro (Q_DISABLE_COPY (QObject)) som eksplisitt sorger for at ingen QObject kan kopieres. QObject s er ikke ment a bli kopiert. Generelt er QObject s ment a representere unike objekter med identitet; det vil si, de samsvarer med virkelige ting som har en slags vedvarende identitet.

En umiddelbar konsekvens av denne ikke-kopipolitikken er at et QObject aldri kan overfores av verdi til noen funksjon. Kopiering av QObjects datamedlemmer til et annet QObject er fortsatt mulig, men de to resulterende QObjectene anses a v re forskjellige.

Enkeltargumentkonstruksjoner av QObject (og avledede klasser) bor utpekes eksplisitt for a unnga at utilsiktede konverteringer skjer. [62] QObject er ikke ment a v re en innehaver av midlertidig verdi, og det bor ikke v re mulig a opprette en implisitt fra en peker eller en enkel verdi.

Hver QObject kan ha (hoyst) en foreldre QObject, og et vilkarlig stort antall QObject-barn. Med andre ord, typen av hvert barn ma v re QObject eller ma v re avledet fra QObject. Hver QObject-butikk peker pa sine barn i en QObjectList [63]. Selve listen er opprettet pa en lat mate for a minimere overhead for objekter som ikke har noen barn. Fordi hvert barn er et QObject og kan ha en vilkarlig stor samling barn, er det lett a se hvorfor kopiering av QObject s ikke er tillatt.

Begrepet barn kan bidra til a klargjore ideen om identitet og ikke-kopieringspolitikken for QObject s. Hvis du representerer individuelle mennesker som QObject s, er ideen om en unik identitet for hvert QObject klart. Ogsa klart er ideen om barn. Regelen som gjor at hver QObject har mest mulig en forelder, kan ses som en mate a forenkle implementeringen av denne klassen pa. Til slutt skiller ikke-kopipolitikken seg som en klar nodvendighet. Selv om det var mulig a «klone» en person (dvs. kopiere datamedlemmene til et annet QObject), gjor sporsmalet om hva man skal gjore med barna til den personen at klonen ville v re et separat og distinkt objekt med en annerledes identitet.

Hver QObject-forelder administrerer sine barn. Dette betyr at QObjects barn blir odelagt under destructor-samtalen.

Barnelisten etablerer en toveisforening mellom QObjects:

Hvert foreldreobjekt kjenner adressen til hvert av sine barnobjekter.

Hvert barnobjekt kjenner adressen til foreldreobjektet.

Innstille foreldrene til et QObject legger implisitt sin adresse til foreldrenes barneliste; dvs.,

legger objA-pekeren til barnelisten over objB. Hvis du senere har.

da blir objA-pekeren fjernet fra barnelisten over objB og lagt til barnelisten over objC. En slik handling kalles reparenting.

Foreldre versus baseklasser.

Foreldreobjekter bor ikke forveksles med grunnklasser. Forholdet mellom foreldre og barn er ment a beskrive inneslutning eller ledelse av gjenstander ved kjoring. Det baseavledede forholdet er et statisk forhold mellom klasser bestemt pa kompileringstidspunktet.

Det er mulig at et foreldreobjekt ogsa kan v re en forekomst av en grunnklasse av noen av sine barnobjekter. Disse to typer relasjoner er tydelige og ma ikke forveksles, spesielt med tanke pa at mange av dine objekter kommer direkte eller indirekte fra QObject. Figur 8.1 skal klargjore denne ideen.

Som du sa tidligere, kommer widgets av et grafisk brukergrensesnitt (GUI) alle fra QWidget, som er avledet fra QObject. Som med QObjects refererer vi til ethvert objekt av en klasse som er avledet av QWidget som en QWidget (eller noen ganger, bare widget). I en GUI er foreldre og barns relasjoner vanligvis synlige: Barn widgets vises i foreldre widgets. I figur 8.1 har dialogboksgrensen flere barn, inkludert: En etikettgrensesnitt, en linjeredigeringsgrensesnitt og to trykknapps widgets. Den har ogsa en tittellinje-widget, som kan v re forelder eller sosken i dialogboksen. Den leveres vanligvis av vindushandtereren, og inneholder flere barn widgets, inkludert knapp widgets som gjor det mulig for en bruker a minimere, maksimere eller lukke dialogboksen.

Behovet for krav til barneledelse er ogsa synlig i figur 8.1. Nar du lukker dialogboksen (for eksempel ved a klikke pa den lille X-knappen overst til hoyre), vil du at hele dialogvinduet skal forsvinne fra skjermen (dvs. bli odelagt). Du vil ikke ha stykker av den (for eksempel den merkelige knappen eller etikettdisplayet) til a ligge pa skjermen, og du vil ikke legge byrden pa alt det oppryddet pa programmereren. Derfor er hver QObject ansvarlig for a odelegge alle sine barn nar destructoren heter. Dette er en naturlig rekursiv prosess. Nar et QObject skal odelegges, ma det forst ringe destruktoren for hver av sine barn; hvert barnsobjekt ma da ringe til destruktoren for hver av sine barn; og sa videre.

Figur 8.1.1. Foreldre-barnobjekt versus base-avledet klasse.