Russian Qt Forum
Ноябрь 22, 2024, 21:52 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: Не меняется глобальная переменная в функции.  (Прочитано 1973 раз)
Arthas
Новичок

Offline Offline

Сообщений: 1


Просмотр профиля
« : Август 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
« Последнее редактирование: Август 14, 2021, 06:59 от Arthas » Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #1 : Август 14, 2021, 10:45 »

Допустим это кого-то заинтересовало, что он должен делать? Выцарапывать тексты с форума copy/paste? Прилагайте компилябельный проект в zip если такая возможность есть.

Также бросается в глаза: ну поставить точку останова на строке присваивания, возможно условный останов по изменению переменной. Такие действия выполняются каждый день. Или Вы отладчиком не пользуетесь  Непонимающий
Записан
kambala
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4747



Просмотр профиля WWW
« Ответ #2 : Август 14, 2021, 11:40 »

QNetworkAccessManager работает асинхронно, вот и весь ответ. твоя qDebug строчка выполняется до совершения запроса. правильное значение будет после отработки функции rez_player (и то если ошибка не пришла).
Записан

Изучением C++ вымощена дорога в Qt.

UTF-8 has been around since 1993 and Unicode 2.0 since 1996; if you have created any 8-bit character content since 1996 in anything other than UTF-8, then I hate you. © Matt Gallagher
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #3 : Август 17, 2021, 10:30 »

QNetworkAccessManager работает асинхронно, вот и весь ответ.
95% что Вы "попали", но мне не нравится сам метод Улыбающийся Зачем гадать если можно просто посмотреть в отладчике?
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.052 секунд. Запросов: 23.