plashless.

Bytter til QML fra QWidget ved hjelp av Qt og PyQt.

Dette er pa hoyt niva, los samling av diskusjon og lenker.

Kontekst: du har en tverrplattformapp skrevet med Qt og PyQt. Det er skrevet med QWidgets. Du vil bytte fra QWidgets til QML.

Diskusjonen er ikke eksklusiv for PyQt. Mye av diskusjonen gjelder ogsa apps som er skrevet i C ++, men nevner PyQt ogsa.

Dette kan ogsa ha noen relevans for apps som er skrevet i QML / Qt Quick.

Hvorfor bytte til QML fra QWidget?

Dette er mulige arsaker:

QML bruker innfodt plattformsstil mens QWidget ikke har innfodt utseende og folelse pa noen plattformer (iOS) QML folger sterkere modellViewController-paradigmet QML er declarativ (mer kompakt og tett) en QML GUI er lettere a endre (for a gi flere eller forbedrede GUI & # 8217; s for samme forretningsmodell)

For meg er den forste grunnen den mest overbevisende. Den siste grunnen er minst overbevisende: du har sannsynligvis vunnet a endre GUI ofte (men her snakker vi om a endre minst implementeringen av et GUI.)

(Qt apps er ekskludert fra Windows Store fordi Qt ikke stottet Windows8 / WinRt, men Qt5.4 og QML kan rette opp det?)

Model View Controller-paradigmet.

Det er ganske sannsynlig at de eksisterende QWidget-appene dine ikke strenge holder seg til MVC-paradigmet. Dermed ma du sannsynligvis reflektere koden din: separat modellkode fra visningskode.

En strategi for a utvikle (kodeendringer) for a bytte til QML fra QWidget.

Forutsatt at appen din bruker QWidgets allerede kjorer og har tester, er en god strategi a holde QWidget-implementeringen av View-jobben, mens du utvikler QML-implementeringen av View. Med andre ord, bruk testdrevet utvikling: gjor sma endringer, og test deretter QWidget-implementeringen og QML-implementeringen. QWidget-implementeringen skal alltid v re fullt funksjonell etter hver forandring. QML-implementeringen vil ogsa alltid fungere, men i en stubbed-out, minimal mote.

Endring av eksisterende QWidget-app vil i stor grad inneb re:

splitting klasser langs modell / visning linjer konvertering prosedyre kalles til signaler, forbindelser og egenskaper.

Bytte i QML-implementeringen av visningen vil bare v re en liten endring i oppstartskoden: opprette QML i stedet for QWidgets. (Det er litt mer komplisert enn det, du kan gjore forbindelser i QML i stedet for i hovedappen.)

Embedding QML i en QWidget-app.

Du kan implementere hovedapplikasjonsvinduet (og alle andre GUI) i QML. Men du kan ogsa legge inn QML GUI i en QWidget-app.

Kort sagt inneb rer det a bruke QQuickView. Men en QQuickView er ikke en QWidget. Men du kan pakke inn en QQuickView i en QWidget: Qt dokumentasjon: Introduksjon av QWidget :: createWindowContainer () diskuterer hvordan a pakke en QQuickView i en QWidget.

Hvorfor behold et QWidget-skjerm som legger inn QML? Jeg mistenker at det er fa grunner til a gjore det. En grunn kan v re bare strategien som er omtalt ovenfor; fa fottene vate ved a legge inn QML, og gjor det siste trinnet a konvertere hovedvinduet fra QWidget til QML.

Grunnen min var annerledes: Appen min bruker utforlig UI-plukking av objekter fra et QGraphicsScene. QML-scenen viser ikke samme API for a plukke at QGraphicsScene gjor det.

Mer om grensesnittet mellom modell og visning ved hjelp av QML.

Hvor & # 8216; fra C ++ & # 8217; mer generelt betyr & # 8216; fra modellobjekter & # 8217; . Og diskusjonen gjelder for modellobjekter som er skrevet i PyQt.

Samspillet er toveis, toveis:

Kontroll (i MVC) er fra visningen til modellen Visningen er fra modellen til visningen.

Interaksjonen din kan v re en retning eller begge deler:

en v r app er bare en visning av v ret en styling app er bare en kontroller av et dokument.

Mye av logikken i QML er ikke forretningslogikk, bare GUI logikk. For eksempel kan en knapp bytte sider og ikke pavirke forretningsmodellen. Knappen & # 8216; styrer & # 8217; utsikten, men ikke forretningsmodellen.

Ikke alt samspillet ma v re mellom modellen og visningen. Hvis du for eksempel legger inn QML i en QWidget-app, kan QWidget-appen kanskje bare aktivere (vise, synliggjore) en QML-visningskomponent. Med andre ord kan samspillet v re mellom delen av visningen implementert i QWidgets og delen av visningen implementert i QML.

PyQt og QML.

PyQt stotter fullt ut QML. Du kan bruke Python og PyQt til din modell.

Jeg har delt et hacky Github-prosjekt der jeg l rer og tester PyQt og QML.

Av samme grunn bruker du QML for visningen, bor du vurdere Python for modellen (mer uttrykksfull i f rre kodelinjer.)

QML-avgangen: mer b rbar, men mindre innfodt?

Vanligvis gir en kryssplattformlosning visse kompromisser. Noen ganger diskuteres det med begreper som & # 8220; minst fellesnevneren & # 8221; eller & # 8220; tilpasning. & # 8221;

Jeg kan ikke diskutere dette fullt ut her. (Og sannsynligvis settet av kompromisser som er gjort, er ikke fullt dokumentert pa ett sted.) Men du bor vurdere om du vil kunne leve med slike kompromisser.

For eksempel fant jeg ut at en QML Dialog pa et skrivebord (Linux, jeg har ikke testet OSX) apnes i et eget vindu, ikke pa toppen av (forbigaende til) hovedvinduet. Det oppfyller sannsynligvis ikke HIG-ene for stasjon re datamaskiner. Muligens er det en losning som jeg ikke har funnet enna. Eller kanskje jeg burde se pa det som en funksjon a omfavne: Jeg bor gjore dialogene mine ikke-modale og behandle dem som tarer som ikke bor skjule hovedvinduet uansett. Men det er et eksempel pa kompromissene du kanskje ma gjore.

Det er mye mer a diskutere her. Kort fortalt bruker Qt Quick Controls brukbare widgets der det er mulig, og faller deretter tilbake til QWidget-implementeringer hvis det er mulig, og deretter til en ren QML-implementering.

Men igjen, det er vanskelig a vite pa forhand uten a prove det.

Strukturerer QML-kildekoden.

I mange eksempler ser du lange QML-filer. Jeg tror det er en gjenstand for a v re et eksempel: sett alt i en fil for a lese lett. Du kan strukturere QML-kildefiler til mindre filer i flere kataloger, ved hjelp av import.

Pakker appen din.

Jeg forventer ikke noen stoppestopp her. Bare mer a l re. Hvis du allerede pakker en PyQt-app, har du sannsynligvis allerede pakkematerialer som bruker pyrcc. QML er bare en annen ressurs a pakke.

Men, er jeg ikke sikker pa hvordan tredjeparts QML-plugins blir pakket?

En merkelig arkitektur: PyQt og QML bruker to tolker.

En PyQt-app ved hjelp av QML bruker to tolker: Python tolken og QMLs tolk tolk. (Og pa Android er det en tredje Java tolk.) Det er mye diskusjon om sikkerheten til, og begrensninger som brukes av app butikker, re tolker. Men dette er bare en nysgjerrighet, det er allerede frakt-apper, ved hjelp av tolker, i butikkene.

En mal for QML ved hjelp av modeller.

(Jeg haper a redusere det til en enkel mal.)

Skrivebord til mobil GUI forskjell: deling.

Hovedproblemet jeg har funnet er at for enkelte apper (dokumentredigering eller opprettingsapplikasjoner i motsetning til lese- eller browseprogrammer) skrivebordet:

utsetter filsystemet til brukeren (i Fil-menyen) bruker dra og slipp.

mens mobile plattformer bruker begrepet & # 8216; deling & # 8217; til filsystemet og andre apper.

Det mangler spesielt i Qt Quick Control, og er et & # 8216; andelsark & # 8217 ;. Et github-prosjekt QtSharingKit soker a rette opp det, med et QML-plugin.

Pragmatisk betyr det mer arbeid for deg:

l re hvilke QML-plugins er (Opprette C ++ Plugins for QML) a bygge en annen tredjepartsmodul og pakke den med koden din.

Flere lenker om QML, Qt Quick og Quick Controls.

Du bruker disse teknologibitene:

QML et sprak. Qt Quick: standardbiblioteket for typer og funksjonalitet for QML Qt Quick Controls: hermetisert (forhandsbygd) QUI-kontroller bygget med QML QML Applications.