Spor qwidget

Egendefinerte widgets er opprettet i kode. De kan omfatte en kombinasjon av eksisterende widgets, men med tilleggsfunksjonalitet, spor og signaler, eller de kan skrives fra grunnen av, eller en blanding av begge.

Qt Designer tilbyr to mekanismer for a inkorporere egendefinerte widgets:

Den opprinnelige metoden inneb rer lite mer enn a fullfore en dialogboks. Widgets innlemmet pa denne maten vises som flate pixmaps nar de legges til et skjema i Qt Designer, selv i forhandsvisningsmodus. De vises bare i sin sanne form pa kjoretid. Vi forklarer hvordan du oppretter egendefinerte widgets ved hjelp av den opprinnelige tiln rmingen i «Simple Custom Widgets».

Den nye metoden inneb rer a legge inn widgets i et plugin. Widgets som er innlemmet gjennom plugins, vises i sin sanne form i Qt Designer, bade nar du legger ut skjemaet og i forhandsvisningsmodus. Denne tiln rmingen gir mer kraft og fleksibilitet enn den opprinnelige metoden, og dekkes av Creating Custom Widgets with Plugins.

Enkel tilpassede widgets.

Det er to trinn for a lage en egendefinert widget. For det forste ma vi opprette en klasse som definerer widgeten, og for det andre ma vi innlemme widgeten i Qt Designer. A lage widgeten ma gjores om vi lager en enkel tilpasset widget eller et plugin, men for enkle egendefinerte widgets er innlemmelsen i Qt Designer veldig enkel.

Vi vil lage en VCR-stil widget bestaende av fire knapper, spole tilbake, spille, neste og stoppe. Widgeten vil sende ut signaler etter hvilken knapp som er klikket.

Koding av den egendefinerte widgeten.

En tilpasset widget kan besta av en eller flere standard widgets plassert sammen i en bestemt kombinasjon, eller kan skrives fra grunnen av. Vi vil kombinere noen QPushButton-widgets for a danne grunnlaget for var egendefinerte widget.

Vi ser pa topptekstfilen, qt / tools / designer / examples / vcr / vcr.h forst.

Vi inkluderer qwidget.h siden vi skal utlede var tilpassede widget fra QWidget. Vi erkl rer en konstruktor hvor widgeten vil bli opprettet og de fire signalene vi vil at var widget skal sende ut. Siden vi bruker signaler ma vi ogsa inkludere Q_OBJECT makroen.

Gjennomforingen er enkel. Den eneste funksjonen vi implementerer er konstruktoren. Resten av filen bestar av inkluderer uttalelser og innebygde .xpm bilder.

Vi lager en QHBoxLayout der vi plasserer knappene. Vi har bare vist tilbakespolingsknappen i koden ovenfor siden alle de andre er identiske med unntak av navnene pa knappene, pixmaps og signaler. For hver av knappene vi krever, kaller vi QPushButton-konstruktoren som gir den den riktige innebygde pixmappen. Vi legger det til i layoutet. Til slutt kobler vi knappens klikkte () signal til det aktuelle signalet. Siden de klikkte signalene () ikke er spesifikke for var widget, vil vi sende ut signaler som gjenspeiler widgetens bruk. Tilbakespoling (), spill (), etc.-signaler er meningsfylte i sammenheng med var widget, slik at vi propagerer hvert tastes klikkte () -signal til det passende widgetsspesifikke signalet.

Implementeringen er fullfort, men for a sikre at var widget kompilerer og kjorer, vil vi opprette en liten test sele. Testselen vil kreve to filer, en .pro prosjektfil og en main.cpp. Qt / verktoy / designer / eksempler / vcr / vcr.pro prosjektfil:

Qt / tools / designer / examples / vcr / main.cpp filen er ogsa kort:

Nar vi er fornoyd med at den tilpassede widgeten samler og kjorer, er vi klare til a innlemme den i Qt Designer.

I baseklassemaler er opprettelsen av en container tilpasset widget beskrevet.

Legge til egendefinert widget til Qt Designer.

Klikk pa Verktoy | Egendefinert | Rediger egendefinerte widgets for a aktivere dialogboksen Rediger egendefinerte widgets.

Klikk Ny widget, slik at vi er klare til a legge til var nye widget.

Endre klassenavnet fra ‘MyCustomWidget’ til ‘Vcr’.

Klikk pa ellipsis (.) -knappen til hoyre for redigering av Headerfile-linjen for a aktivere filen Apne dialogboksen. Finn vcr.h, velg det, og klikk Apne. Det vil na vises som headerfilen.

Hvis du har en piktogram som du vil bruke til a identifisere widgeten pa verktoylinjen, klikker du ellipsis-knappen til hoyre for Pixmap-egenskapen. (Ellipsis-knappen vises nar du klikker pa Verdi-delen av egenskapslisten med en pixmap eller ikonSett egenskap.)

I vart eksempel har vi filen qt / tools / designer / examples / vcr / play.xpm som vi skal bruke til dette formalet.

Siden vi kjenner den minste fornuftige storrelsen for var widget, legger vi disse verdiene inn i Storrelseshint-spin-boksene. Skriv inn en bredde pa 80 (i venstre hands spin-boks), og en hoyde pa 20 (i hoyre hands spin-boks).

De gjenv rende elementene som skal fylles ut, vil avhenge av egenskapene til widgeten du har opprettet. Hvis for eksempel din widget kan brukes til a inneholde andre widgets, vil du merke avkrysningsboksen Container Widget. I tilfelle av vart Vcr-eksempel er det eneste signalene vi trenger a legge til.

Klikk pa Signaler-fanen. Klikk pa Ny signal-knappen og skriv inn signalnavnet ’tilbakespoling ()’. Klikk pa Ny signal igjen, og denne gangen skriver du inn ‘play ()’. Legg til ‘neste ()’ og ‘stopp ()’ signaler pa samme mate.

Siden vart eksempel ikke har noen spor eller egenskaper vi er ferdige, og kan klikke Lukk. Et nytt ikon vil vises i Qt Designers verktoylinjer som representerer den nye widgeten. Hvis du oppretter et nytt skjema, kan du legge til Vcr-widgets og koble Vcrs signaler til sporene dine.

Innlemme tilpassede widgets som har sine egne spor og egenskaper oppnas pa samme mate som a legge til signaler. All nodvendig informasjon er i var tilpassede widgetens headerfil.

Opprette egendefinerte widgets med plugger.

Denne delen viser deg hvordan du skriver en egendefinert widget og hvordan du legger inn den egendefinerte widgeten i et plugin. Det er ingen begrensninger eller spesielle hensyn som ma tas i betraktning nar du lager en widget som er bestemt til a bli et plugin. Hvis du er en erfaren Qt-programmerer, kan du trygt hoppe over delen om a lage en egendefinert widget og ga direkte til Opprett et plugin.

Opprette en egendefinert widget.

En tilpasset widget er ofte en spesialisering (underklasse) av en annen widget eller en kombinasjon av widgets som fungerer sammen eller en blanding av begge disse tiln rmingene. Hvis du bare vil ha en samling av widgets i en bestemt konfigurasjon, er det enklest a lage dem, velge dem som en gruppe, og kopiere og lime dem etter behov i Qt Designer. Tilpassede widgets opprettes vanligvis nar du ma legge til ny funksjonalitet i eksisterende widgets eller grupper av widgets.

Vi har to anbefalinger som du bor vurdere nar du oppretter en egendefinert widget for et plugin:

A bruke Qts eiendomssystem vil gi Qt Designer-brukere et direkte verktoy for a konfigurere widgeten gjennom egenskapsreditoren. (Se dokumentasjonen til Qt Properties.)

Overvei a lage widgetens offentlige «sett» -funksjoner i offentlige spor, slik at du kan utfore signallokkelforbindelser med widgeten i Qt Designer.

I lopet av dette kapitlet vil vi lage en enkel men nyttig widget, ‘FileChooser’, som vi senere vil gjore tilgjengelig i Qt Designer som et plugin. I praksis er de fleste tilpassede widgets opprettet for a legge til funksjonalitet i stedet for a komponere widgets, sa vi vil lage var widget i kode i stedet for a bruke Qt Designer for a reflektere denne tiln rmingen. FileChooser bestar av en QLineEdit og en QPushButton. QLineEdit brukes til a holde et fil- eller katalognavn, QPushButton brukes til a starte en fildialog gjennom hvilken brukeren kan velge en fil eller katalog.

The FileChooser Custom Widget.

Hvis du har fulgt handboken til dette punktet, kan du godt lage denne tilpassede widgeten selv. Hvis du er sikker pa at du kan lage din egen versjon av widgeten, eller ha en annen widget du vil bli til et plugin, kan du ga videre til a lage et plugin. Hvis du foretrekker a lese hvordan vi opprettet widgeten, les sa videre.

Koding Widget-grensesnittet.

Vi vil arbeide trinn for trinn gjennom widgetens header-fil, qt / verktoy / designer / eksempler / filechooser / widget / filechooser.h.

Var widget vil bli avledet fra QWidget, sa vi inkluderer qwidget.h headerfilen. Vi videresender ogsa de to klassene som var widget skal bygges fra.

Vi inkluderer Q_OBJECT-makroen, siden dette kreves for klasser som erkl rer signaler eller spor. Q_ENUMS-erkl ringen brukes til a registrere modusopptellingen. Var widget har to egenskaper, modus, for a lagre om brukeren skal velge en fil eller et katalog og filnavn som lagrer filen eller katalogen de valgte.

Konstruktoren er erkl rt pa standard mate for widgets. Vi erkl rer to offentlige funksjoner, filnavn () for a returnere filnavnet, og modus () for a returnere modusen.

De to «set» -funksjonene er deklarert som offentlige spor. setFileName () og setMode () angir henholdsvis filnavn og modus. Vi erkl rer et enkelt signal, fileNameChanged (). Den private sporet, chooseFile () kalles av widgeten selv nar knappen er klikket.

En peker til QLineEdit og QPushButton, samt en modusvariabel holdes som private data.

Koding av implementeringen.

Vi vil arbeide trinn for trinn gjennom implementeringen som finnes i qt / tools / designer / examples / filechooser / widget / filechooser.cpp.

Konstruktoren sender foreldre og navn til superklass, QWidget, og initierer ogsa privatmodusdata, md, til filmodus.

Vi begynner med a lage en horisontal boks layout (QHBoxLayout) og legge til en QLineEdit og en QPushButton til den.

Vi kobler linjepediets tekstChanged () -signal til den tilpassede widgetens filenNameChanged () -signal. Dette sikrer at hvis brukeren endrer teksten i QLineEdit, blir dette faktum forplantet via den egendefinerte widgetens eget signal. Knappens klikkede () -signal er koblet til den tilpassede widgetens selectFile () –spor som pakaller den aktuelle dialogen for brukeren a velge sin fil eller katalog.

Vi angir lineEdit som fokusproxy for var egendefinerte widget. Dette betyr at nar widgeten er gitt fokus, gar fokuset faktisk til lineEdit.

SetFileName () -funksjonen angir filnavnet i QLineEdit, og filenName () -funksjonen returnerer filnavnet fra QLineEdit. SetMode () og modus () -funksjonene (ikke vist) settes pa samme mate og returnerer gjeldende modus.

Nar chooseFile () kalles, presenterer den brukeren en fil- eller katalogdialog, avhengig av modusen. Hvis brukeren velger en fil eller katalog, blir QLineEdit oppdatert med den valgte filen eller katalogen, og signalet FileNameChanged () sendes ut.

Selv om disse to filene fullforer implementeringen av FileChooser-widgeten, er det god praksis a skrive en test sele for a kontrollere at widgeten oppforer seg som forventet for du forsoker a sette den inn i et plugin.

Testing Implementering.

Vi presenterer en rudiment r test sele som vil tillate oss a kjore var egendefinerte widget. Testselen krever to filer, en main.cpp for a inneholde FileChooser, og en .pro-fil for a lage Makefile fra. Her er qt / verktoy / designer / eksempler / filechooser / widget / main.cpp:

Og her er qt / tools / designer / examples / filechooser / widget / filechooser.pro.

Vi kan lage makefile ved hjelp av qmake: qmake -o Makefile filechooser.pro, sa kan vi lage og kjore selen for a teste var nye widget. Nar vi er fornoyd med at den tilpassede widgeten er robust og har oppforselen vi krever, kan vi legge den inn i et plugin.

Opprette et plugin.

Qt-plugins kan brukes til a gi selvstendige programvarekomponenter for Qt-applikasjoner. Qt stotter na opprettelsen av fem typer plugins: kodeker, bildeformater, database drivere, stiler og egendefinerte widgets. I denne delen vil vi forklare hvordan du konverterer var filhacker tilpassede widget til en Qt Designer tilpasset widget plugin.

En Qt Designer tilpasset widget plugin er alltid avledet fra QWidgetPlugin. Amout av kode som ma skrives er minimal.

For a lage din egen plugin er det sannsynligvis enklest a starte ved a kopiere vare eksempel plugin.h og plugin.cpp filer og endre ‘CustomWidgetPlugin’ til navnet du onsker a bruke til widget-plugin implementeringsklassen din. Nedenfor gir vi en introduksjon til header-filen, selv om den ikke trenger noen endringer utenom klassenavnet. Implementeringsfilen krever enkle endringer, for det meste mer klassenavn; Vi vil gjennomga hver funksjon i sin tur og forklare hva du trenger a gjore.

Implementeringen av CustomWidgetPlugin.

Vi har kalt var header-fil plugin.h, og vi har kalt var plugin-klasse CustomWidgetPlugin siden vi bruker var plugin-klasse for a pakke inn vare tilpassede widgets. Vi presenterer hele headerfilen for a gi deg et inntrykk av omfanget av implementeringen som kreves. De fleste funksjonene krever bare noen fa linjer med kode.

QWidgetPlugin Funksjonene.

Opprett din egen plugin .cpp-fil ved a kopiere var plugin.cpp-fil og endre alle forekomster av ‘CustomWidgetPlugin’ til navnet du onsker a bruke til implementering av widget-plugin. De fleste av de andre endringene erstatter bare navnet pa var egendefinerte kontroll, ‘FileChooser’, med navnet pa din egendefinerte kontroll. Du ma kanskje legge til ekstra hvis klausuler hvis du har mer enn en tilpasset kontroll i plugin-implementeringen.

Vi ser na pa konstruktoren.

Konstruktoren trenger ikke a gjore noe. Bare kopier oss med klassenavnet du onsker a bruke til widget-plugin-implementeringen din.

Ingen destructor er nodvendig.

Noklene fungerer.

For hver widgetklasse som du vil pakke inn i pluginimplementasjonen, bor du levere en nokkel som klassen kan identifiseres for. Denne nokkelen ma v re klassens navn, sa i vart eksempel legger vi til en enkelt nokkel, ‘FileChooser’.

Opprett () -funksjonen.

I denne funksjonen oppretter vi en forekomst av den forespurte klassen og returnerer en QWidget-peker til den nylig opprettede widgeten. Kopier denne funksjonen for a endre klassenavnet og funksjonsnavnet, og opprett en forekomst av widgeten, akkurat som vi har gjort her. (Se dokumentasjonen til Qt Plugin for mer informasjon.)

Funksjonen includeFile ().

Denne funksjonen returnerer navnet pa inkluderingsfilen for den egendefinerte widgeten. Kopier denne funksjonen ved a endre klassenavnet, nokkelen og inkludere filnavn som passer til din egen egendefinerte widget.

Vi bruker gruppen () -funksjonen til a identifisere hvilken Qt Designer-verktoylinjegruppe denne tilpassede widgeten skal v re en del av. Hvis vi bruker et navn som ikke er i bruk, vil Qt Designer opprette en ny verktoylinjegruppe med det oppgitte navnet. Kopier denne funksjonen, endre klassenavnet, nokkel- og gruppenavnet for a passe til din egen widgetpluginimplementering.

Funksjonen iconSet () returnerer pixmapet som skal brukes i verktoylinjen for a representere den egendefinerte widgeten. Funksjonen ToolTip () returnerer verktoytipteksten, og whatsThis () -funksjonen returnerer Whats This-teksten. Kopier hver av disse funksjonene, og endre klassenavnet, nokkelen og strengen du returnerer for a passe til din egen widgetpluginimplementering.

Funksjonen isContainer ().

Kopier denne funksjonen for a endre klassenavnet slik at det passer til implementering av widget-plugin. Den skal returnere SANNE hvis din egendefinerte widget kan inneholde andre widgets, f.eks. som QFrame, eller FALSK hvis den ikke ma inneholde andre widgets, f.eks. som QPushButton.

Q_EXPORT_PLUGIN makroen.

Denne makroen identifiserer modulen som et plugin – den andre koden implementerer bare det relevante grensesnittet, dvs. omslutt de klassene du onsker a gjore tilgjengelig.

Denne makroen ma vises en gang i pluginet ditt. Det skal kopieres med klassenavnet endret til navnet pa pluginets klasse. (Se Qt Plugin-dokumentasjonen for mer informasjon om plugin-inngangspunktet.)

Hver widget du pakker inn i en widget plugin implementering blir en klasse som plugin implementering tilbyr. Det er ingen grense for antall klasser du kan inkludere i en pluginimplementering.

Prosjektfilen.

Prosjektfilen for et plugin er noe annerledes enn en applikasjons prosjektfil, men i de fleste tilfeller kan du bruke var prosjektfil ved a endre bare HEADERS og SOURCES-linjene.

Endre HEADERS-linjen for a vise pluginens header-fil pluss en headerfil for hver av widgetene dine. Gjor tilsvarende endring for KILDE-linjen. Hvis du lager en Makefile med qmake og gjor prosjektet, vil plugin bli opprettet og plassert i en katalog der Qt Designer kan finne den. Neste gang du kjorer Qt Designer, registreres det nye pluginet og lastes det automatisk, og viser symbolet i verktoylinjen du angav.

Bruke Widget Plugin.

Nar pluginet er kompilert, blir det automatisk funnet og lastet av Qt Designer neste gang Qt Designer kjores. Bruk din tilpassede widget akkurat som alle andre.

Hvis du vil bruke pluginet i et annet av prosjektene dine, kan du koble det mot ved a legge til en passende linje for prosjektet, f.eks. ved a legge til en linje som dette til prosjektets .pro-fil:

Nar du vil distribuere soknaden din, ta med kompilert plugin med kjorbar. Installer plugin-modulen i plugin / widgets underkatalog i Qt-installasjonsmappen. Hvis du ikke vil bruke standard plugin-banen, har installeringsprosessen bestemt banen du vil bruke for plugin, og lagre banen, f.eks. bruker QSettings, for programmet skal leses nar det kjorer. Programmet kan deretter ringe QApplication :: addLibraryPath () med denne banen og pluginene dine vil v re tilgjengelige for programmet. Legg merke til at den endelige delen av banen, det vil si stiler, widgets, etc., ikke kan endres.

Plugger og gjengede applikasjoner.

Hvis du vil bygge et plugin som du vil bruke med et threaded Qt-bibliotek (om pluggen selv bruker trader), ma du bruke et gjenget miljo. Spesielt ma du bruke et gjenget Qt-bibliotek, og du ma bygge Qt Designer med det biblioteket. Din .pro-fil for pluginet ditt ma inneholde linjen: