Skip to content
  • Categories
  • Recent
  • Tags
  • Popular
  • Users
  • Groups
  • Search
  • Get Qt Extensions
  • Unsolved
Collapse
Brand Logo
  1. Home
  2. International
  3. Polish
  4. Przekazanie wartości z funkcji
Forum Updated to NodeBB v4.3 + New Features

Przekazanie wartości z funkcji

Scheduled Pinned Locked Moved Polish
8 Posts 2 Posters 4.3k Views 1 Watching
  • Oldest to Newest
  • Newest to Oldest
  • Most Votes
Reply
  • Reply as topic
Log in to reply
This topic has been deleted. Only users with topic management privileges can see it.
  • R Offline
    R Offline
    rondels
    wrote on last edited by
    #1

    .

    1 Reply Last reply
    0
    • sierdzioS Offline
      sierdzioS Offline
      sierdzio
      Moderators
      wrote on last edited by
      #2

      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)

      (Z(:^

      1 Reply Last reply
      0
      • R Offline
        R Offline
        rondels
        wrote on last edited by
        #3

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

        1 Reply Last reply
        0
        • sierdzioS Offline
          sierdzioS Offline
          sierdzio
          Moderators
          wrote on last edited by
          #4

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

          (Z(:^

          1 Reply Last reply
          0
          • R Offline
            R Offline
            rondels
            wrote on last edited by
            #5

            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?

            1 Reply Last reply
            0
            • sierdzioS Offline
              sierdzioS Offline
              sierdzio
              Moderators
              wrote on last edited by
              #6

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

              (Z(:^

              1 Reply Last reply
              0
              • R Offline
                R Offline
                rondels
                wrote on last edited by
                #7

                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 ;)

                1 Reply Last reply
                0
                • sierdzioS Offline
                  sierdzioS Offline
                  sierdzio
                  Moderators
                  wrote on last edited by
                  #8

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

                  (Z(:^

                  1 Reply Last reply
                  0

                  • Login

                  • Login or register to search.
                  • First post
                    Last post
                  0
                  • Categories
                  • Recent
                  • Tags
                  • Popular
                  • Users
                  • Groups
                  • Search
                  • Get Qt Extensions
                  • Unsolved