Я сделал часть страницы регистрации в QML и обработал textInput
с помощью функции setContextProperty
. Но у меня проблема, когда мне нужно сделать запрос на публикацию. Ответственный за этот метод
void NetworkManager::sendRequest(const QNetworkRequest &request, const QJsonObject &data) {
QNetworkReply *reply = m_manager->post(request, QJsonDocument(data).toJson());
m_replies.append(reply);
}
m_manager
и m_replies
определены в классе, поэтому
private:
QNetworkAccessManager *m_manager;
QList<QNetworkReply *> m_replies;
Я пытался использовать метод sendRequest
внутри onClicked
сигнала на кнопке reg. Но если я пытаюсь определить объект QNetworkRequest
в QML, у меня возникает ошибка:
нет соответствующей функции для вызова
'QQmlContext::setContextProperty(const char[15], QNetworkRequest&)'
Я прочитал документацию QQmlContext
и QVariant
и понял, что не могу определить объект QNetworkRequest
таким образом. Я пытался определить кнопку из QML в C++ с помощью objectName
и использовать сигналы и слоты, но это не сработало. Может быть, кто-нибудь знает какие-либо методы определения объектов C++ в QML или QML в C++? Я еще не нашел его.
Я нашел решение своей проблемы:
engine.rootContext()->setContextProperty("UserRegRequest", QVariant::fromValue(UserRegRequest));
Создайте объект QML из C++ с указанными свойствами
Как только вы найдете решение, мы не закрываем вопрос, а оставляем его открытым, чтобы будущие посетители могли найти ваш вопрос и ответы на него. Кроме того, другие пользователи могут оставить больше ответов, если будут найдены лучшие/другие решения. Вместо этого вы можете нажать на галочку в своем ответе, чтобы она стала зеленой, сигнализируя будущим пользователям, что именно этот ответ решил вашу проблему.
Я понял, что это не решение, потому что получаю сообщение об ошибке: сервер ответил: «Неверный запрос». Но если я делаю URL-адрес жесткого кода внутри метода sendRequest, все работает. Это означает, что если мне нужно выполнить запрос на публикацию для нескольких страниц, мне нужно создать несколько аналогичных методов sendRequest с жестко заданным URL-адресом внутри методов sendRequest.
Ваш ответ можно улучшить, добавив дополнительную вспомогательную информацию. Пожалуйста, отредактируйте , добавив дополнительную информацию, например цитаты или документацию, чтобы другие могли подтвердить правильность вашего ответа. Более подробную информацию о том, как писать хорошие ответы, вы можете найти в справочном центре.
Ну, у меня нет идей, как определить объект QNetworkRequest из cpp в qml. По этой причине я создал несколько идентичных методов с жестким URL-адресом внутри и элементами запроса.
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);
};
параметры функции передаются из qml, где я заранее определил параметры
onClicked:{
var authPhone = inputNumber.text
manager.sendAuthRequest(authPhone);
}
Мне не нравится это решение, но, возможно, оно кому-то поможет или кто-то предложит лучшее решение.
Возможно, это не по теме, но существует XMLHttpRequest, который можно определить и использовать в QML вообще без использования C++.