Russian Qt Forum

Qt => Вопросы новичков => Тема начата: Arthas от Август 14, 2021, 06:29



Название: Не меняется глобальная переменная в функции.
Отправлено: Arthas от Август 14, 2021, 06:29
Здравствуйте!
Суть проблемы:
Есть переменная id_dev. Получаю ответ с сервера через api через get_responses(), и в функции rez_player(QNetworkReply *reply) пытаюсь присвоить id_dev новое значение. Внутри функции переменная меняется, но глобально нет.
это видно на 18 строчке, когда я пытаюсь вывести эту переменную я получаю изначальное значение, а не то, что нужно. Вот и вопрос, как мне присвоить ей значение в той функции?


.cpp
Код:
#include "gm.h"
#include "ui_gm.h"
//////       VAR      /////
QString nick_dev = "123";
QString id_last_match;
QString id_dev;
QString token = "*******************************";
//////       VAR      /////
GM::GM(QWidget *parent): QMainWindow(parent), ui(new Ui::GM)
{
    ui->setupUi(this);
    this->setWindowFlags(Qt::FramelessWindowHint);
    m_title = new KcWdTitlebar(this);
    ui->Lay->addWidget(m_title);
    this->setWindowIcon(QIcon(QPixmap((":/resource/img/logo.png"))));
    
    get_responses();
    qDebug()<<id_dev;
}
GM::~GM(){delete ui;}

void GM::get_responses()
{
    get_player = new QNetworkAccessManager();
    connect(get_player, SIGNAL(finished(QNetworkReply*)), this, SLOT(rez_player(QNetworkReply*)));
    get_player->get(QNetworkRequest(QUrl("https://api.vimeworld.ru/user/name/" + nick_dev + "?token=" + token)));
}
void GM::rez_player(QNetworkReply *reply)
{
    if(!reply->error())
    {
        id_dev = QString::number(QJsonDocument::fromJson(reply->readAll()).array().at(0).toObject().value("id").toInt());
    }
    else{}
}

.h
Код:
#ifndef GM_H
#define GM_H

#include <QMainWindow>
#include "Bar.h"
#include <QJsonDocument>
#include <QJsonObject>
#include <QJsonArray>
#include <QNetworkRequest>
#include <QNetworkReply>
#include <QUrl>
#include <QNetworkAccessManager>

QT_BEGIN_NAMESPACE
namespace Ui { class GM; }
QT_END_NAMESPACE

class GM : public QMainWindow
{
    Q_OBJECT

public:
    GM(QWidget *parent = nullptr);
    ~GM();

private:
    QNetworkAccessManager *get_player;
    QNetworkAccessManager *get_id_last_match;
    KcWdTitlebar *m_title;
    Ui::GM *ui;

private slots:
    void get_responses();
    void rez_player(QNetworkReply *reply);
    void rez_id_last_match(QNetworkReply *reply);
};
#endif // GM_H

.pro
Код:
QT       += core gui
QT += network

greaterThan(QT_MAJOR_VERSION, 4): QT += widgets

CONFIG += c++11


# You can make your code fail to compile if it uses deprecated APIs.
# In order to do so, uncomment the following line.
#DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x060000    # disables all the APIs deprecated before Qt 6.0.0

SOURCES += \
    Bar.cpp \
    main.cpp \
    gm.cpp

HEADERS += \
    Bar.h \
    gm.h

FORMS += \
    gm.ui

# Default rules for deployment.
qnx: target.path = /tmp/$${TARGET}/bin
else: unix:!android: target.path = /opt/$${TARGET}/bin
!isEmpty(target.path): INSTALLS += target

RESOURCES += \
    resource.qrc


Название: Re: Не меняется глобальная переменная в функции.
Отправлено: Igors от Август 14, 2021, 10:45
Допустим это кого-то заинтересовало, что он должен делать? Выцарапывать тексты с форума copy/paste? Прилагайте компилябельный проект в zip если такая возможность есть.

Также бросается в глаза: ну поставить точку останова на строке присваивания, возможно условный останов по изменению переменной. Такие действия выполняются каждый день. Или Вы отладчиком не пользуетесь  ???


Название: Re: Не меняется глобальная переменная в функции.
Отправлено: kambala от Август 14, 2021, 11:40
QNetworkAccessManager работает асинхронно, вот и весь ответ. твоя qDebug строчка выполняется до совершения запроса. правильное значение будет после отработки функции rez_player (и то если ошибка не пришла).


Название: Re: Не меняется глобальная переменная в функции.
Отправлено: Igors от Август 17, 2021, 10:30
QNetworkAccessManager работает асинхронно, вот и весь ответ.
95% что Вы "попали", но мне не нравится сам метод :) Зачем гадать если можно просто посмотреть в отладчике?