Qt Forum.

Qt Forum.

Signal for QML og spor av C ++ i Qt Controls2.

Jeg er ny pa Qt Controls2. Jeg designer en klasser der tekstfelttekst skal vises pa skjermen.

Jeg vil utfore denne prosessen med Signal of qml og handtere den i cpp-sporet. Forsokt mange eksempler kan bare ikke finne en matchende til mitt problem.

Sa v r sa snill a gi meg en losning, hold meg fast i det i mer enn 2 dager.

Hva malet er – & gt;

Jeg vil skrive ut innholdet i tekstfeltet ved a bruke min cpp-fil.

med knappeknapp Jeg sender ut signalet med tekstfeltinngang og det skal ringe til cppSlot av min cpp-fil og der skal den skrive ut den tekstfeltinngangen. enten i konsollen eller det kan v re hvor som helst du kan foresla.

Qml-fil jobber, jeg har provd a kjore onclick-egenskapen med Direct Console.log () og i tillegg til a opprette en funksjon for a skrive ut den teksten i tekstfeltet.

her er min QML-fil- & gt;

importer QtQuick 2,7.

importer QtQuick.Controls 2.0.

importer QtQuick.Layouts 1.0.

og her er min CPP-fil- & gt;

klasse MyClass: offentlig QObject.

void cppSlot (const QVariant & msg)

qDebug () & lt; & lt; «Kalt C ++-sporet med melding:» & Lt; & lt; msg;

int main (int argc, char * argv [])

QGuiApplication app (argc, argv);

kommentert delen er koden jeg prover og det gir meg en feil,

Du ma sende poeng til QObject :: connect (). Pass & Class, ikke klasse.

Qt-dokumentasjonssok (Chrome, Firefox): forum.qt.io/topic/35616/

Sa gutta Na loste problemet med noen sma endringer Jeg brukte dette nettstedet->

som min referanse. og takk @ JKSH. det var et av hovedproblemet.

Du provde en mate. Men sjekk nedenfor trinnene (som vi vanligvis gjor nar vi vil koble QML og CPP via signalspor):

og her er min CPP-fil- & gt;

klasse MyClass: offentlig QObject.

void cppSlot (QString msg) /// Du kan ikke bruke QString & amp; siden referansevariabel ikke kan gjenkjennes fra QML – & gt; C + + kode.

qDebug () & lt; & lt; «Kalt C ++-sporet med melding:» & Lt; & lt; msg;

int main (int argc, char * argv [])

aktivert: messageField.length & gt; 0.

onClicked: myClassInstance.cppSlot (messageField.text); /// ringe spor direkte. Du kan ogsa lage Q_INVOKABLE funksjon som skal hentes herfra.

Ohkay. Jeg implementerte dette. og det fungerte ogsa. ogsa lese om.

for den som er ny som meg, rett meg hvis jeg har feil.

her hva vi gjor er- & gt;

Vi gir et aliasnavn til forekomstobjektet til klassen eller sier at vi sender adressen til objektet til qml-filen.

nar qml-filen vil fa denne «myClassInstance & quot; det vil bruke det som en forekomst objekt a ringe Slot oppkalt som cppSlot () av MyClass.

vil ringe funksjonen cppSlot () og det vil gjore det arbeid der.

v r sa snill a fjerne min tvil,

Vi kan gjore samme prosedyre pa tre mater.

1) -> Normal Signal og Slot Handling.

hvilken metode brukes mer i dag til dager prosjekter ??

Med andre ord. Hvilken metode skal jeg v re mer fokusert pa mens jeg integrerer QML og C ++ ??

Hvis du vil bruke pa QML-siden pa en mate, et objekt som er opprettet i C ++, bruker du setContextProperty til a gjore objektet tilgjengelig for QML-motoren.

Du kan motta signaler sendt av en C ++-objekt i QML sa lenge objektet er tilgjengelig.

Du kan bruke C + + –spor som vanlige funksjoner i QML sa lenge objektet er tilgjengelig.

Du kan bruke Q_INVOKABLE C ++-funksjoner som vanlige funksjoner i QML sa lenge objektet er tilgjengelig.

«Hvilken metode skal jeg v re mer fokusert pa?» Det avhenger av dine behov. Hvis du trenger en funksjon for a v re et spor i C ++ (du kobler det til C ++-signaler), sa bor det selvfolgelig v re en sporplass. Hvis ikke, er Q_INVOKABLE nok, men du mister ikke noe hvis du gjor det til et spor. Signal er signal, du kan ikke motta signaler fra C ++-objekter hvis du ikke gjor dem til a v re signaler, kan du? Sa lenge jeg vet at du ikke kan koble til et C + + –spor med et QML-signal, sa er det bare a ringe en C ++-funksjon fra QML.

En annen ting du bor v re kjent med er C ++ egenskaper, http://doc.qt.io/qt-5/properties.html. Sett NOTIFY-signalet for en egenskap, og du kan bruke den automatisk i QML-bindinger.

I motsetning til hva jeg nettopp sa, kan du koble et QML-signal til et C + + –spor, som nevnt av blogginnlegget. Det er bare ikke veldig praktisk nar du har et komplisert QML-objekttr og bruk av objektene fra QML-treet er ikke en anbefalt mate a handtere ting pa (selv om det selvfolgelig er opp til deg hvis du vil bruke det og hvis det passer dine behov ).

Her er et eksempel som viser Q_INVOKABLE og C ++-egenskap som brukes i QML.

Hvis du vil avkoble knappen og objektX i eksempelet mitt, kan du bruke Tilkoblinger. Det er litt som C ++ connect ().

du ser bedre hvordan like og ulik det er a koble til ().

@ Eeli-K Takk sa mye. dette var mitt neste problem. at du bare lost.

Jeg skulle google det ned om eiendommen. og dette er det beste eksemplet jeg kan fa.

Forst brukte jeg CHAT TUTORIAL av QUICK CONTROL 2, men til slutt ble det sv rt komplekst.

Sa brukte dette innlegget.

Sa med det tidligere innlegget av din, klargjorde du det.

Q_INVOKABLE og PROPERTY gir koden en kant som gjor den mer lesbar og forstaelig for brukeren.

Og hovedsakelig er begge disse benyttet for a gjore koden lost koblet. Hvis endringer skal gjores i en kontekst, ma bare enkelte deler av koden bare endres.

Derfor er disse mer brukt i store prosjekter og.

Signaler og spor brukes hovedsakelig nar signalene sendes til det valgte sporet fra flere valg.

Med andre ord- & gt; Nar det er mulighet i koden din, kan funksjonaliteten endres fra objekter til objekter og objekter til mekanisme (hvis det er tilstedev relse av flere spor og signaler av samme type og parameter) og deretter ved bruk.

Vi kan endre disse funksjonene ved a endre sammenhengen mellom sporene og signalene.

derfor brukes de i dagens prosjekter bare for a koble funksjonaliteten mellom objekter og ekte deler handteres av Q_INVOKABLE og PROPERTY type funksjoner.

Og takk igjen ..

«PROPERTY gir koden en kant i a gjore det mer brukervennlig og forstaelig»

Ja, men ikke sa mye med Q_INVOKABLE. Det eneste Q_INVOKABLE gjor er at det gjor oss i stand til a ringe funksjonen via Qt meta-objektsystemet, i dette tilfellet a bruke det som en normal funksjon fra QML. Fra QML-synspunktet hjelper Q_INVOKABLE ikke til avkopling mer enn noen funksjon.

Qts Signal-slot-system er opprettet for a aktivere hendelsesbasert system med sv rt los kopling. Det er ogsa veldig lesbart og forstaelig nar du er vant til det.

«derfor blir de brukt i dagens prosjekter bare for a koble funksjonaliteten mellom objekter og ekte deler handteres av Q_INVOKABLE og PROPERTY type funksjoner.»

Hva mener du med «ekte deler handteres av. & Quot ;? Q_INVOKABLE metoder er bare metoder. EIENDOM skaper veldig nyttige snarveier for noen funksjonalitet som ellers skal skrives eksplisitt, og det gjor data tilgjengelig via metaobjektsystemet. Og jeg gjentar at du kan lage medlemsfunksjoner i stedet for Q_INVOKABLES hvis du vil bruke dem i QML. Q_INVOKABLE gir deg ikke noen kant over spor, det gir bare eksplisitt hint at funksjonen ikke brukes som et spor i C ++.

For a legge til flere QML-signal-slotsforbindelser til ditt arsenal (i stedet for bare en onSignal-handler), se Tilkobling av signaler til metoder og signaler i http://doc.qt.io/qt-5/qtqml-syntax-signals.html. Du kan koble et QML-signal til et C ++-spor eller til en Q_INVOKABLE.

@ Eeli-K Beklager for sent svar, pa grunn av Holi Festival kunne jeg ikke apne forumet.

Vel, takk sa mye for a fjerne alle tvilene. Forsta bruken av alle aspekter og vil inneb re disse oppl ringene, etter hvert som prosjektet vil v re i nod.

Takk sa mye dere alle, for a gi deg tid til dette innlegget. Hjalp meg mye som nybegynner.

Ser ut som din forbindelse til Qt Forum var tapt, vent mens vi forsoker a koble til igjen.



Hilsen! Vil du spille i det mest heldige kasinoet? Vi fant det for deg. Klikk her nå!