TheBlackSwan994
TheBlackSwan994

Reputation: 1

How to define QNetworkRequest object from cpp to qml

I have made a frontend piece of registration page in QML and processing of textInput using the setContextProperty function. But I have a problem when I need to do post request. Responsible for this method

void NetworkManager::sendRequest(const QNetworkRequest &request, const QJsonObject &data) {
    QNetworkReply *reply = m_manager->post(request, QJsonDocument(data).toJson());
    m_replies.append(reply);
}

m_manager and m_replies defined in class so

private:
    QNetworkAccessManager *m_manager;
    QList<QNetworkReply *> m_replies;

I tried to use method sendRequest inside onClicked signal on reg button. But if I trying to define QNetworkRequest object in QML I have an error:
no matching function for call to 'QQmlContext::setContextProperty(const char[15], QNetworkRequest&)'

I have read the documentation of QQmlContext and QVariant, and I understood, that I can't to define QNetworkRequest object in this way. I tried to define a button from QML to C++ with objectName and use signals and slots but it isn't working to. Maybe someone knows any methods to define C++ objects in QML, or QML to C++? I haven't found it yet.

Upvotes: 0

Views: 92

Answers (3)

TheBlackSwan994
TheBlackSwan994

Reputation: 1

Well, I don't have any ideas, how to define a QNetworkRequest object from cpp to qml. Because of this I have made several identical methods, with hardcode URL inside and query items

void NetworkManager::sendAuthRequest(QString authPhone){
    QUrl url("http://89.221.60.161:3000/api/auth/login");

    QUrlQuery query;
    QByteArray postData;
    query.addQueryItem("phone", authPhone);
    query.addQueryItem("notificationToken", "d3ef6dac-38b5-442e-898b-b030d014efb9");

    postData = query.toString(QUrl::FullyEncoded).toUtf8();

    QNetworkRequest request(url);
    request.setHeader(QNetworkRequest::ContentTypeHeader, "application/x-www-form-urlencoded");

    m_manager->post(request, postData);

};

the function parameters are passed from qml, where I have defined the parameters in advance

    onClicked:{
        var authPhone = inputNumber.text
        manager.sendAuthRequest(authPhone);
    }

I don't like this solution, but maybe it will help someone, or someone will come up with a better solution.

Upvotes: 0

TheBlackSwan994
TheBlackSwan994

Reputation: 1

I have found a solution to my problem:

engine.rootContext()->setContextProperty("UserRegRequest", QVariant::fromValue(UserRegRequest));

Create QML object from C++ with specified properties

Upvotes: 0

TheBlackSwan994
TheBlackSwan994

Reputation: 1

I understood, that it isn't a solution, because i get an error: server replied: Bad Request. But if i doing hardcode url inside sendRequest method everything works. It means that if i need to do post request for multiple pages, i need to make several similar methods sendRequest with hardcode url inside sendRequest methods.

Upvotes: 0

Related Questions