Przekazanie wartości z funkcji



  • .


  • Moderators

    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ę."


  • Moderators

    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
    }
    @



  • Mam jeszcze jedno, raczej głupie pytanie ;)

    Kiedy zwyczajnie deklaruje QString m_token w mainwindow, funkcja go nie widzi. Jak zrobić, żeby go zobaczyła?


  • Moderators

    Raczej niemożliwe. Chyba że deklarujesz zmienną w funkcji a nie w pliku nagłówkowym.



  • Zadeklarowałam w pliku nagłówkowym i już wszystko jest tak jakbym chciała. Głównym problemem był brak synchronizacji, ale po użyciu Twojej pętli problem się rozwiązał. Wielkie dzięki ;)


  • Moderators

    Spoko, miło wiedzieć. Jak coś to pytaj dalej, najlepiej w nowym temacie :)


Log in to reply
 

Looks like your connection to Qt Forum was lost, please wait while we try to reconnect.