Kommentarer, Kode og Qt. Noen ord om den fantastiske verden av programvare engineering.

Hvorfor QNetworkAccessManager ikke skal ha det ferdige signalet (QNetworkReply *).

En annen viktig observasjon nar du gjor mange foresporsler under QNetworkAccessManager-levetiden, er a slette QNetworkReply-objektene.

Takk, ja! Jeg utelatt dette i koden min.

Og slett dem med foresporsel-> slet Later ()

Api jeg vil virkelig ha, passerer C ++ 0x lambda for a fa ()

Jeg horte at Qt5 skulle bruke noen funksjoner i C ++ 0x. Jeg haper ogsa at de vil bruke lambda-funksjoner mer generelt, og dette ser ut som et fint sted a dra nytte av dem.

Du kan gjore (jeg har gjort det og har brukt det) & # 8216; rekursiv & # 8217; QNetworkReply :: finished (): Du kan koble til ferdig () signal til spor hvor du oppretter ny QNetworkReply tilkobling til samme spor. Interessante ting.

Hvordan sporer du deretter i denne rekursive sporet programstatusen? Noen forekomster av global variabel med if-elses, eller & # 8230 ;?

Det er ikke rekursivt, det ser bare ut som det er rekursivt. Bedre navn ville kanskje selvforbindende spor. Det handlet om nettverksdata som har markor / personsoking. For a motta neste data trenger du forrige markor, og i det selvavspillende sporet hvor du nettopp har mottatt forrige markor, lager du en ny nettverksforesporsel som du kobler til dette sakalte selvopptasende sporet.

& # 8216; beklager forskjellige innlogginger, ingen twitter-tilgang for meg pa dette stedet & # 8217;

Ikke avtalt fullt ut. Det er noen tilfeller nar du mottar QNetworkReply da parameteren er bedre enn a bruke QNetworkReply :: finished (). For eksempel nar du har en statslos nettverksprotokoll med mange forskjellige kommandoer. I dette tilfellet vil du ha ett sted a administrere anrop til kommandoer, svarhandterere i stedet for a handtere det i alle disse sma handteringsmetodene.

Vel & # 8211; hvis i sa fall din soknad logikk eller nettverkskode ikke er avhengig av nettverksdata, da dette ville v re ok. Ogsa, som jeg sa i teksten, er det praktisk a fa nettverksdataene med den forste tiln rmingen jeg presenterte hvis du egentlig bare vil lese en klump med data, og det er det. Men dette er ikke alltid tilfelle. Jeg ville til og med argumentere for saken

Men enda viktigere, du kan gjore akkurat det du sa ovenfor med den andre tiln rmingen uten behov for flere spor. Sa selv om du bare vil lese data fra nettverket med mange forskjellige kommandoer og anropskommandoer, kan du gjore det i ett enkelt spor og koble til den sporet fra QNetworkReply’s ferdige () -signalet ( andre tiln rming). I sporet far du dataene med QNetworkReply * r = qobject_cast (QObject :: sender ()). Dette er akkurat det du ville fa hvis du fikk QNetworkReply * r som signalparameter.

Hvorfor tror jeg at sistnevnte tiln rming er bedre, selv om sluttresultatet er det samme, og du vil ikke bry deg om pafolgende nettverkssamtaler? Pa grunn av API klarhet. Bare en tiln rming er bedre enn to tiln rminger for en gitt brukstilstand.

avsender () er ikke en god praksis. Ifolge Qt’s dokument, bor utviklere v re forsiktige nar bruker avsender ().

Min losning er a bruke en medlemsvariabel for en foresporsel, etter a ha kommet inn i spor, ring deleteLater og tilordne den til en NULL-peker. Du vil ogsa gjore ytterligere anstrengelser for a unnga at denne pekeren overstyres ved a ringe foresporsel pa nytt.

Jeg bryr meg ikke om i dette tilfellet hvis avsender () ikke er god praksis. Hva vil du gjore hvis du har flere nettverksforesporsler? Hvordan vil du avgjore hvilken QNetworkReply-peker er?

Guy du kan bruke QSignalMapper til a spore hvilke objekter som kaller hvilket signal. Sender () er greit, men QSignalMapper ville v re bedre praksis.

Jeg har lest denne delen av dokumentasjonen flere ganger, og jeg kan ikke v re enig med deg. Pa hvilken mate vil du si at den ikke er god praksis? Qt dokumentasjon sier.

& # 8220; Advarsel: Denne funksjonen bryter mot det objektorienterte prinsippet om modularitet. A fa tilgang til avsenderen kan imidlertid v re nyttig nar mange signaler er koblet til et enkelt spor. & # 8221;

Sikkert & # 8211; det er kanskje ikke sa elegant som et annet designmonster som du implementerer deg selv, men i dette QNetworkReply * brukskassen synes det a passe godt inn i dette designet. Dokumentasjonen sier ogsa at denne pekeren vil v re ugyldig hvis avsenderen blir odelagt nar du sender avsender (), men igjen, i QNetworkAccessManager-saken kan dette ikke v re tilfelle. Og siden QNAM allerede er asynk, har jeg ikke behov for a sette det inn i en separat trad heller, sa trader er ikke et problem for meg i dette tilfellet.

Flott! Dette loste helt mitt problem! Mange takk.

Du trenger ikke a koble til og koble fra signaler i den forste tiln rmingen, bare lagre en variabel i foresporselen, f.eks.

void WebAPI :: requestFinished (QNetworkReply * a_reply)

Jeg foretrekker ofte denne tiln rmingen til a ha et annet spor for hver annen foresporsel.

Dette lyder faktisk som en god tiln rming, da du da bare har ett sted a handtere alle svar pa alle foresporsler (for den klassen).

Jeg tror dette kan bli bedre dokumentert i Qt-dokumentene, skjont.

Dette hjalp virkelig, takk. Bruk av attributter gjor det ganske enkelt.

I Python, med detaljer ommitted, ville dette v re ideen:

def finished_request (selv, svar):

# handtere grunnleggende svar.

# handtere detaljer svar.

Vel, jeg administrerte foresporselen & # 8220; states / type & # 8221; inne i min tilpassede QObject pa en helt annen mate! Jeg forbedrer koden min ved a bruke tiln rmingen din, takk! Her er en lim av min faktiske kode hvis noen er interessert i hvordan ikke a handtere foresporselstyper / grunner / status http://pastebin.com/DQfxtxV9.

Lost mitt problem, takk veldig mye! Jeg folger dette eksemplet, men far alltid feil i soknaden min!