Qt-dokumentasjon.

Qt-dokumentasjon.

I Qt undo rammen, implementeres alle handlinger som brukeren utforer i klasser som arver QUndoCommand. En undo kommandoklass vet hvordan du kan gjore om igjen () – eller bare gjor forste gang – og angre () en handling. For hver handling brukeren utforer, blir en kommando plassert pa en QUndoStack. Siden stakken inneholder alle kommandoer som er utfort (stablet i kronologisk rekkefolge) pa dokumentet, kan det rulle statusen til dokumentet bakover og fremover ved a angre og gjenta kommandoene. Se oversiktsdokumentet for en introduksjon pa hoyt niva til a angre rammen.

Eksempelet for a utove implementerer en enkel diagramapplikasjon. Det er mulig a legge til og slette elementer, som er enten boks eller rektangul r formet, og flytte elementene ved a dra dem med musen. Den angre stakken er vist i et QUndoView, som er en liste der kommandoene vises som listeposter. Angre og gjenta er tilgjengelig via redigeringsmenyen. Brukeren kan ogsa velge en kommando fra a angre visningen.

Vi bruker grafikkvisningen for a implementere diagrammet. Vi behandler bare den relaterte koden kort som rammeverket har egne eksempler (for eksempel diagrameksempeleksemplet).

Eksemplet bestar av folgende klasser:

MainWindow er hovedvinduet og arrangerer eksempelets widgets. Den skaper kommandoene basert pa brukerinngang og holder dem pa kommandostakken. AddCommand legger til et element pa scenen. DeleteCommand sletter et element fra scenen. MoveCommand nar et element er flyttet, flyttes MoveCommand til start- og stoppposisjonene for flyttingen, og det beveger elementet i henhold til disse nar gjenta () og angre () kalles. DiagramScene arver QGraphicsScene og sender signaler til MoveComands nar et element flyttes. DiagramItem erverver QGraphicsPolygonItem og representerer et element i diagrammet.

MainWindow Class Definition.

MainWindow-klassen opprettholder a angre stabelen, det vil si at den skaper QUndoCommands og skyver og popper dem fra stakken nar den mottar det utloste () signalet fra undoAction og redoAction.

MainWindow Class Implementation.

Vi vil starte med en titt pa konstruktoren:

I konstruktoren setter vi opp DiagramScene og QGraphicsView.

Her er createUndoView () -funksjonen:

QUndoView er en widget som viser teksten, som er angitt med setText () -funksjonen, for hver QUndoCommand i fortryddsstakken i en liste.

Her er createActions () -funksjonen:

Funksjonen createActions () setter opp alle eksemplene handlinger pa maten som er vist ovenfor. CreateUndoAction () og createRedoAction () hjelper oss med kassehandlinger som er deaktivert og aktivert basert pa stablens tilstand. Ogsa teksten til handlingen vil bli oppdatert automatisk basert pa teksten () for a angre pa nytt. For de andre handlingene har vi implementert spor i MainWindow-klassen.

Her er createMenus () -funksjonen:

Vi ma bruke QMenu aboutToShow () og aboutToHide () signaler siden vi bare vil sletteAction skal aktiveres nar vi har valgt et element.

Her er itemMoved () -sporet:

Vi skyver bare en MoveCommand pa stakken, som ringer pa () pa den.

Her er deleteItem () -sporet:

Et element ma velges for a bli slettet. Vi ma sjekke om den er valgt som deleteAction kan aktiveres selv om et element ikke er valgt. Dette kan skje ettersom vi ikke far et signal eller en hendelse nar et element er valgt.

Her er itemMenuAboutToShow () og itemMenuAboutToHide () spor:

Vi implementerer itemMenuAboutToShow () og itemMenuAboutToHide () for a fa en dynamisk elementmeny. Disse sporene er koblet til omToShow () og aboutToHide () signaler. Vi trenger dette for a deaktivere eller aktivere deleteAction.

Her er addBox () -sporet:

Funksjonen addBox () lager en AddCommand og skyver den pa a angre stabelen.

Her er addTriangle () sot:

AddTriangle () -funksjonen oppretter en AddCommand og skyver den pa a angre stableen.

Her er implementeringen av om ():

Omsporet er utlost av omAction og viser en om boks for eksempelet.

AddCommand Class Definition.

Klassen AddCommand legger til DiagramItem-grafikkelementer til DiagramScene.

AddCommand Class Implementation.

Vi starter med konstruktoren:

Vi lager forst DiagramItem for a legge til DiagramScene. Funksjonen setText () lar oss sette en QString som beskriver kommandoen. Vi bruker dette for a fa egendefinerte meldinger i QUndoView og i menyen i hovedvinduet.

angre () fjerner varen fra scenen.

Vi stiller posisjonen til varen som vi ikke gjor dette i konstruktoren.

DeleteCommand Class Definition.

Klassen DeleteCommand implementerer funksjonaliteten for a fjerne et element fra scenen.

DeleteCommand Class Implementering.

Vi vet at det ma v re ett valgt element, da det ikke er mulig a opprette en slettkommando, med mindre elementet som skal slettes, er valgt, og at bare ett element kan velges nar som helst. Elementet ma ikke velges hvis det settes inn pa scenen.

Gjenstanden er enkelt satt inn pa scenen.

Elementet er fjernet fra scenen.

MoveCommand Class Definition.

MergeWith () er reimplemented for a gjore etterfolgende trekk for et element en MoveCommand, dvs. objektet vil bli flyttet tilbake til startposisjonen til forste trekk.

MoveCommand Class Implementering.

Konstruktoren til MoveCommand ser slik ut:

Vi lagrer bade de gamle og nye stillingene for a angre og gjore om igjen.

Vi stiller ganske enkelt elementene i den gamle stillingen og oppdaterer scenen.

Vi setter varen til sin nye posisjon.

Nar en MoveCommand er opprettet, kalles denne funksjonen for a sjekke om den skal slas sammen med forrige kommando. Det er det forrige kommandobjektet som holdes pa stakken. Funksjonen returnerer sann hvis kommandoen slas sammen; ellers falsk.

Vi kontrollerer forst om det er det samme elementet som er flyttet to ganger, i sa fall fusjonerer vi kommandoene. Vi oppdaterer posisjonsposisjonen slik at den tar den siste posisjonen i flyt-sekvensen nar den er slettet.

DiagramScene Class Definition.

DiagramScene implementerer funksjonaliteten for a flytte et DiagramItem med musen. Den gir et signal nar et trekk er ferdig. Dette er tatt av MainWindow, som gjor MoveCommands. Vi undersoker ikke implementeringen av DiagramScene da den bare omhandler grafikkrammeproblemer.

Hovedfunksjonen ().

Hovedfunksjonen () av programmet ser slik ut:

Vi tegner et rutenett i bakgrunnen til DiagramScene, sa vi bruker en ressursfil. Resten av funksjonen oppretter MainWindow og viser den som et toppnivavindu.