QtWebKit-broen.

Teknologien.

QtWebKit-broen er en mekanisme som utvider WebKits JavaScript-miljo for a fa tilgang til innfodte objekter representert som QObjects. Det utnytter QObject-introspeksjonen, en del av objektmodellen, som gjor det enkelt a integrere med det dynamiske JavaScript-miljoet. For eksempel QObject egenskaper kort direkte til JavaScript egenskaper.

Det er to hovedbrukstilfeller for QtWebKit-broen: webinnhold i egne applikasjoner og tynne klienter.

Webinnhold i native applikasjoner.

Dette er en vanlig brukstilfelle i klassisk Qt-applikasjon, og et designmonster som brukes av flere moderne applikasjoner som et program som inneholder en mediespiller, spilleliste og musikkbutikk. Spillelisteadministratoren er vanligvis best forfatter som et klassisk skrivebordsprogram, med den robuste QWidgets som applikasjonens ryggrad. Mediespillerkontrollen har vanligvis et tilpasset utseende og er best skrevet ved hjelp av Graphics View-rammen eller QtDeclarative. Musikkbutikken, som viser dynamisk innhold fra Internett og blir endret raskt, er best forfatter i HTML og vedlikeholdes pa serveren.

Med QtWebKit-broen kan musikkbutikk-komponenten samhandle med innfodte deler av programmet, for eksempel nar en fil ma lagres til et bestemt sted.

Tynne klienter.

Brukssaken bruker Qt som en innfodt backend av et fullt webprogram, en sakalt tynn klient. I dette brukssaken er hele brukergrensesnittet drevet av HTML, JavaScript og CSS. I tillegg bruker den Qt-baserte komponenter for a fa tilgang til innfodte funksjoner som vanligvis ikke er utsatt for nettet, eller for a aktivere hjelpekomponenter som er best skrevet i C ++.

Et eksempel pa en slik klient er et brukergrensesnitt for en video-on-demand-tjeneste pa en TV. Hele innholdet og brukergrensesnittet kan holdes pa serveren, serveres dynamisk gjennom HTTP og gjengis med WebKit. Ekstra innfodte komponenter brukes til a fa tilgang til maskinvarespesifikke funksjoner som a trekke ut en liste over bilder ut av en videostrom.

Forskjell fra andre Bridge Technologies.

Selvfolgelig er QtWebKit ikke den eneste broteknologien der ute. NPAPI, for eksempel, er en lang tid standard for web-innfodte broer. Pa grunn av Qts meta-objekt-system, er det fullt enklere a utvikle fulle applikasjoner som utnytter webteknologi med QtWebKit-broen enn med NPAPI. NPAPI er imidlertid bedre for kryssbrowser-plugins, fordi det er en akseptert standard.

Nar du utvikler et plugin for en nettleser, anbefales NPAPI. Nar du utvikler en fullstendig applikasjon som bruker HTML-gjengivelse, anbefales QtWebKit-broen.

Forholdet til QtScript.

QtWebKit-broen ligner QtScript, spesielt for noen av funksjonene som er beskrevet pa siden Scripting Making Applications. Imidlertid gir Qt 4.7 ikke den fulle QtScript API for webapplikasjoner. Full stotte er planlagt for fremtidige versjoner. Det kan hende du merker at noen av funksjonene som er beskrevet her, er en eksakt kopi av de som er beskrevet pa siden Skriverbare sider. Det skyldes at QtWebKit-broen er en delmengde av den funksjonaliteten, og denne siden prover a fange opp de fullstendige egenskapene som er tilgjengelig gjennom QtWebKit-broen spesifikt.

Tilgang til QObjects.

Gjor QObjects kjent med JavaScript via QWebFrame.

Som standard er ingen QObjects tilgjengelige av webmiljo av sikkerhetshensyn. Nar en webapplikasjon onsker a fa tilgang til et innfodt QObject, ma det eksplisitt gi tilgang til dette QObject, ved hjelp av folgende samtale:

Bruke signaler og spor.

QtWebKit-broen tilpasser Qts sentrale Signals and Slots-funksjon for skripting. Det er tre hovedmater a bruke signaler og spor med QtWebKit-broen:

Hybrid C ++ / script: C ++ programkode kobler et signal til en skriptfunksjon. Denne tiln rmingen er nyttig hvis du har et QObject, men ikke vil utsette objektet selv for skriptmiljoet. Du vil bare definere hvordan skriptet reagerer pa et signal og la det opp til C ++-siden av soknaden din for a etablere forbindelsen mellom C ++-signalet og JavaScript-sporet. Hybrid script / C ++: Et skript kan koble signaler og spor for a etablere forbindelser mellom forhandsdefinerte objekter som soknaden utsettes for skriptmiljoet. I dette scenariet er sporene seg fremdeles skrevet i C ++, men definisjonen av forbindelsene er fullt dynamisk (script-definert). Rent skriptdefinert: Et skript kan bade definere signalhandteringsfunksjoner (effektivt «spor som er skrevet i JavaScript») og konfigurere tilkoblingene som bruker disse handteringsprogrammene. For eksempel kan et skript definere en funksjon som vil handtere signalet QLineEdit :: returnPressed (), og deretter koble det signalet til skriptfunksjonen.

V r oppmerksom pa at QtScript-funksjoner som qScriptConnect er uavvikelige i webmiljoet.

Signal til funksjonstilkoblinger.

Anropet til a koble til () oppretter en forbindelse mellom signalet somethingChanged og sporet myInterestingScriptFunction. Nar objektet myObject sender signalet noe, blir plassen minInterestingScriptFunction kalt automatisk.

Argumentet for connect () kan v re en hvilken som helst JavaScript-funksjon som i eksempelet ovenfor eller et spor av et QObject som i folgende eksempel:

Nar argumentet er et spor av et QObject, ma argumenttypene til signalet og sporet ikke v re kompatible. Om mulig konverterer QtWebKit-broen signalargumentene slik at de samsvarer med sporargumentet.

For a koble fra et spor fra et signal, ringer du signalets frakobling () -funksjon med sporet som argument:

Nar en skriptfunksjon er pakalt som svar pa et signal, blir dette objektet det globale objektet.

Signal til medlemsfunksjonstilkoblinger.

Anropet til a koble til () oppretter en forbindelse mellom signalet somethingChanged og slot-funksjonen. Nar objektet myObject sender signalet noe, blir slotsfunksjonen til objektet thisObject kalt automatisk. La oss illustrere dette med et eksempel.

Hvis du har en trykknapp i et skjema, vil du vanligvis ha skjemaet til a gjore noe som svar pa knappens klikkede signal. Anropet til a koble til () sorger for at funksjonen onClicked () kalles nar du klikker pa trykknappen, det vil si nar signalet klikket () er utgitt av myButton. Sporet onClicked () skriver ut verdien av x som lagret i skjemaet.

For a koble fra et spor fra et signal, passerer du de samme argumentene for a koble fra () som du passerte for a koble til (). Generelt ser dette ut som folger:

Signal til navngitte medlemsfunktionstilkoblinger.

Denne formen for connect () -funksjonen krever at det forste argumentet thisObject er objektet som vil bli bundet til dette nar funksjonfunksjonen navn er pakalt som svar pa signalet noeChanged. Det andre argumentfunksjonsnavnet angir navnet pa en funksjon som er koblet til signalet. Det refererer til en medlemsfunksjon av objektet thisObject.

Merk at funksjonen er lost nar tilkoblingen er laget, ikke nar signalet sendes ut.

For a koble fra signalet, send de samme argumentene for a koble fra () som du passerte for a koble til:

Feilhandtering.

Nar tilkobling () eller frakobling () lykkes, returnerer funksjonen udefinert; Ellers vil det kaste et skript unntak. Du kan fa en feilmelding fra det resulterende feilobjektet. Eksempel:

Utsende signaler fra skript.

For a sende et signal fra skriptkoden, bruker du bare signalfunksjonen, og sender de relevante argumentene:

Det er for oyeblikket ikke mulig a definere et nytt signal i et skript; ie.e # x2e;, ma alle signaler defineres av C ++ klasser.

Overbelastede signaler og spor.

Nar et signal eller spor er overbelastet, vil QtWebKit-broen forsoke a velge riktig overbelastning basert pa de faktiske typene av QScriptValue-argumentene som er involvert i funksjonen. For eksempel, hvis klassen din har spor myOverloadedSlot (int) og myOverloadedSlot (QString), vil folgende skriptkode oppfore seg rimelig:

Du kan angi en bestemt overbelastning ved a bruke tilgang til array-stilegenskaper med den normaliserte signaturen til C ++-funksjonen som eiendomsnavnet:

Hvis overbelastningene har forskjellig antall argumenter, vil QtWebKit-broen velge overbelastningen med argumenttellingen som best matcher det faktiske antall argumenter som sendes til sporet.

For overbelastede signaler vil JavaScript kaste en feil hvis du prover a koble til signalet ved navn; Du ma referere til signalet med full normalisert signatur av den aktuelle overbelastningen du vil koble til.

Invokable Methods.

Bade spor og signaler kan brukes som standard fra skript. I tillegg er det ogsa mulig a definere en metode som kan hentes fra skript, selv om metoden ikke er et signal eller et spor. Dette er spesielt nyttig for funksjoner med returtyper, da spor ikke normalt returnerer noe (det ville v re meningslost a returnere en verdi fra et spor, siden de tilkoblede signalene ikke kan handtere returverdier). For a gjore en non-slot-metode invokable, ma du bare legge til Q_INVOKABLE makroen for dens definisjon:

Tilgang til egenskaper.

Egenskapene til et QObject er tilgjengelige som egenskaper for det tilsvarende JavaScript-objektet. Nar du manipulerer en eiendom i skriptkoden, vil C ++ get / set-metoden for den egenskapen automatisk bli pakalt. For eksempel, hvis C ++-klassen din har en eiendom som er erkl rt som folger:

sa kan skriptkoden gjore ting som folgende:

A fa tilgang til Child QObjects.

Hvert navngitt barn av et QObject (det vil si hvert barn som QObject :: objectName () ikke returnerer den tomme strengen) er som standard tilgjengelig som en egenskap for JavaScript-wrapper-objektet. Hvis du for eksempel har en QDialog med en barn-widget hvis objektnavn-egenskap er «okButton» , du kan fa tilgang til dette objektet i skriptkoden gjennom uttrykket.

Fordi objektnavn er en Q_PROPERTY, kan du manipulere navnet i skriptkoden for a gi nytt navn til en gjenstand. For eksempel:

Datatyper.

Nar du ringer spor, mottar signaler eller far tilgang til egenskaper, er det vanligvis en del nyttelast. For eksempel vil en eiendom «tekst» kan returnere en QString-parameter. QtWebKit-broen gjor jobben med a konvertere mellom en gitt JavaScript-datatype og den forventede eller gitt Qt-typen. Hver Qt-type har et korresponderende sett med regler for hvordan JavaScript behandler det.

Datatypeomregningene gjelder ogsa for dataene som returneres fra ikke-ugyldige patalbare metoder.

Alle Qt numeriske datatyper konverteres til eller fra et JavaScript-nummer. Disse inkluderer int, kort, flyt, dobbelt og de b rbare Qt-typene (qreal, qint etc). Et spesielt tilfelle er QChar. Hvis et spor forventer QChar, bruker QtWebKit-broen Unicode-verdien i tilfelle et tall og det forste tegnet i tilfelle en streng.

Merk at ikke-standard (typedef’ed) talltyper ikke automatisk konverteres til eller fra et JavaScript-nummer – vi foreslar at du bruker standard nummertyper for signaler, spor og egenskaper.

Nar et ikke-nummer overfores som et argument til en metode eller egenskap som forventer et tall, brukes den aktuelle JavaScript-konvertering-funksjonen (parseInt / parseFloat).

Nar JavaScript apner metoder eller egenskaper som forventer en QString, konverterer QtWebKit-broen automatisk verdien til en streng (hvis den ikke allerede er en streng), ved hjelp av den innebygde JavaScript toString-metoden.

Nar en QString sendes til JavaScript fra et signal eller en eiendom, konverterer QtWebKit-broen til en JavaScript-streng.

Dato & amp; Tid.

Bade QDate, QTime og QDateTime blir automatisk oversatt til eller fra JavaScript Date-objektet. Hvis et tall er bestatt som et argument til en metode som forventer en av dato / tidstyper, behandler QtWebKit-broen den som en tidsstempel. Hvis et sting er bestatt, prover QtWebKit de forskjellige Qt-datoanalyseringsfunksjonene for a utfore den riktige oversettelsen.

Vanlig uttrykk.

QtWebKit-broen konverterer automatisk et JavaScript RegEx-objekt til en QRegExp. Hvis en streng overfores til en metode som forventer en QRegExp, blir strengen konvertert til en QRegExp.

QtWebKit-broen behandler flere typer lister pa en spesiell mate: QVariantList, QStringList, QObjectList og QList & lt; int & gt ;. Nar et spor eller en eiendom forventer en av disse listetyper, prover QtWebKit-broen a konvertere et JavaScript-array til den typen, og konverterer hver av elementets elementer til enkeltelementtype av listen.

Den mest nyttige typen liste er QVariantList, som kan konverteres til og fra hvilken som helst JavaScript-array.

Forbundet (JSON) objekter.

JavaScript-sammensatte objekter, ogsa kjent som JSON-objekter, er variabler som holder en liste over nokkelverdier, hvor alle tastene er strenger og verdiene kan ha hvilken som helst type. Dette oversetter veldig godt til QVariantMap, noe som ikke er noe mer enn en QMap fra QString til QVariant.

Den somlose konverteringen mellom JSON-objekter og QVariantMap muliggjor en veldig praktisk mate a overfore vilkarlig strukturerte data mellom C ++ og JavaScript-miljoet. Hvis den innfodte QObject sikrer at sammensatte verdier konverteres til QVariantMaps og QVariantLists, er JavaScript garantert a motta dem pa en meningsfull mate.

Merk at typer som ikke stottes av JSON, for eksempel JavaScript-funksjoner og getters / setters, ikke konverteres.

Nar et spor eller en eiendom aksepterer en QVariant, oppretter QtWebKit-broen en QVariant som passer best til argumentet som passeres av JavaScript. En streng, for eksempel, blir en QVariant som holder en QString, et normalt JSON-objekt blir en QVariantMap, og et JavaScript-array blir en QVariantList.

Bruke QVariants generost i C ++ pa den maten, gjor C + + programmering litt mer som JavaScript programmering, da det legger til et annet niva av indirection. Passerende QVariants rundt som dette er veldig fleksible. Programmet kan finne ut hvilken type argument pa kjoretid akkurat som JavaScript ville gjore. Men a gjore det tar ogsa bort typen sikkerhet og robusthet av C ++. Vi anbefalte a bruke QVariants bare for hoyt niva funksjoner, og for a beholde det meste av QObjects type-safe.

Pointer til QObject eller QWidget kan brukes i signaler, spor og egenskaper. Dette objektet kan da brukes som et objekt som eksponeres direkte. Dens spor kan paberopes, dets signaler er koblet til, etc. Men denne funksjonaliteten er ganske begrenset – den brukte typen ma v re QObject * eller QWidget *. Hvis den angitte typen er en peker til en ikke-QWidget-underklasse av QObject, gjenkjenner QtWebKit-broen ikke den som et QObject.

Generelt anbefales det a bruke forsiktighet nar man overforer QObjects som argumenter, da disse objektene ikke blir eid av JavaScript-motoren. Det betyr at applikasjonsutvikleren ma v re ekstra forsiktig for ikke a prove a fa tilgang til QObjects som allerede er slettet av det opprinnelige miljoet.

Pixmaps og bilder.

QtWebKit-broen handterer QPixmaps og QImages pa en spesiell mate. Siden QtWebKit lagrer QPixmaps for a representere HTML-bilder, kan QPixmaps som kommer fra det opprinnelige miljoet, brukes direkte inne i WebKit. En QImage eller QPixmap som kommer fra Qt, konverteres til et mellomliggende JavaScript-objekt, som kan representeres som dette:

JavaScript-miljoet kan da bruke pixmapet fra Qt og vise det i HTML-miljoet ved a tilordne det til en eksisterende & lt; img & gt; element med assignToHTMLImageElement (). Det kan ogsa bruke funksjonen toDataURL (), som tillater bruk av pixmap som src-attributtet til et bilde eller som bakgrunnsbildeadresse. V r oppmerksom pa at funksjonen toDataURL () er kostbar og bor brukes med forsiktighet.

Nar et Qt-objekt forventer en QImage eller en QPixmap som input, og argumentet som er bestatt, er et HTML-bildeelement, vil QtWebKit-broen konvertere pixmapet tildelt det bildeelementet til en QPixmap eller en QImage.

QWebElement.

Et signal, spor eller egenskap som forventer eller returnerer en QWebElement, kan fungere somlost med JavaScript-referanser til DOM-elementer. JavaScript-miljoet kan velge DOM-elementer, holde dem i variabler, og deretter sende dem til Qt som QWebElement, og motta dem tilbake. Eksempel:

Dette er spesielt nyttig for a lage tilpassede renderere eller utvidelser til webmiljoet. I stedet for a tvinge Qt til a velge elementet, velger webmiljoet elementet og sender det valgte elementet direkte til Qt.

V r oppmerksom pa at QWebElements ikke er tradsikker – en objekthandtering dem ma leve i brukergrensesnittet.

Arkitekturproblemer.

Begrensning av omfanget av hybridlaget.

Nar du bruker QtWebKit’s hybridfunksjoner, er det en vanlig fallgruve for a gjore APIen eksponert for JavaScript veldig rik og bruk alle funksjonene. Dette forer imidlertid til kompleksitet og kan skape feil som er vanskelig a finne. I stedet er det tilradelig a holde hybridlaget lite og handterbart: opprett en port bare nar det er et faktisk behov for det, dvs. Det er en ny innfodt enabler som krever et direkte grensesnitt til applikasjonslaget. Noen ganger er ny funksjonalitet bedre handtert internt i det opprinnelige laget eller i weblaget. Enkelhet er din venn.

Dette blir vanligvis mer tydelig nar hybridlaget kan skape eller odelegge objekter, eller bruker signaler, spor eller egenskaper med et QObject * -argument. Det anbefales a v re veldig forsiktig og behandle et eksponert QObject som et system – med forsiktig oppmerksomhet til minnehandtering og objekt eierskap.

Internett sikkerhet.

Nar du eksponerer innfodte objekter for et apent webmiljo, er det viktig a forsta sikkerhetsimplikasjonene. Tenk om det eksponerte objektet gjor det mulig for webmiljoet a fa tilgang til ting som ikke burde v re apne, og om nettinnholdet som lastes av den nettsiden, kommer fra en klarert kilde. Generelt, nar eksponering av innfodte QObjects som gir webmiljoet tilgang til privat informasjon eller til funksjonalitet som er potensielt skadelig for klienten, bor slik eksponering balanseres ved a begrense nettsidenes tilgang til klarerte nettadresser bare med HTTPS, og ved a benytte andre tiltak som en del av en sikkerhetsstrategi.

&kopiere; 2015 Qt Company Ltd. Dokumentasjonsbidrag inkludert heri er opphavsrett til deres respektive eiere.

Dokumentasjonen som er gitt her, er lisensiert i henhold til vilkarene i GNU Free Documentation License versjon 1.3 som publisert av Free Software Foundation.

Dokumentasjonskilder kan hentes fra www.qt-project.org.

Qt og respektive logoer er varemerker for The Qt Company Ltd i Finland og / eller andre land over hele verden. Alle andre varemerker tilhorer deres respektive eiere. Personvernregler.


Hei! Vil du spille i det mest populære kasinoet? Vi forbereder det for deg. Prøv her nå!