Przekazanie wartości z funkcji
-
Nie bardzo wiem, o co chodzi, postaram się strzelić w ciemno :)
- po prostu dodaj zmienną QString m_token do swojego MainWindow i tam zapisz wynik. Ale chyba nie o to chodzi
- może chodzi o to, że gdy token jest gotowy, to program ma ruszyć naprzód z jakimiś działaniami? W takim wypadku najlepiej wysłać sygnał gdzieś pod koniec ::postLogin(), a wcześniej połączyć tenże sygnał z jakimś slotem do obróbki danych
- tak całkiem na marginesie, Qt5 będzie miało zestaw klas przeznaczonych specjalnie do parsowania i obróbki danych JSON (QtJsonDB i pokrewne)
-
bq. po prostu dodaj zmienną QString m_token do swojego MainWindow i tam zapisz wynik. Ale chyba nie o to chodzi
Przy funkcji, która ma typowy argument mogę to zrobić bez problemu:
@QString MainWindow::test(int u)
{
QString x="stopa";
return x;}@
@ QString m_token;
m_token=test(5);@Niestety argumentem mojej funkcji jest zmienna typu QNetworkReply i przy wywołaniu w ten sposób:
@ QString m_token;
QNetworkReply* x;
m_token=postLogin(x);@po kompilacji otrzymuję komunikat "Program nieoczekiwanie przerwał pracę."
-
Ah, to mi trochę rozjaśniło sytuację, dzięki.
O to mi chodziło w pierwszym punkcie (bazuję na twoim przykładzie):
@
void MainWindow::test(int u) // zmienione na void!
{
QString x="stopa";
m_token = x; // było: return x;
// można jeszcze dorzucić:
emit tokenReady();
}
@Problemem (ale ma to też masę plusów...) w QNAM jest asynchroniczne API. Sporo się w nim poruszałem swego czasu i pamiętam że cały czas musiałem się musztrować i skupiać na tej idei - jako programiści chyba jesteśmy po prostu silnie przywiązani do idei, że program jest sekwencyjny, linia po linii, a tu przychodzi QNAM i miesza :D
Druga alternatywa jaką podałem dalej pozostaje opcją, z resztą bardzo podobną - tylko nieco bardziej w nurcie functional programming.
Trzeba się przestawić - program nie będzie się wykonywał po kolei i tyle. Jeśli chcesz wymusić synchronizację, trzeba się uciekać do niezbyt miłego czekania:
@
forever { // pętli dopóki nie ma gotowego tokena
if (m_token.isEmpty())
qApp->processEvents(); // puszcza event loop "w tle"
else
break; // token gotowy, można iść dalej w programie
}
@ -
Raczej niemożliwe. Chyba że deklarujesz zmienną w funkcji a nie w pliku nagłówkowym.
-
Spoko, miło wiedzieć. Jak coś to pytaj dalej, najlepiej w nowym temacie :)