mirror of https://github.com/qt/qtgrpc.git
120 lines
3.2 KiB
QML
120 lines
3.2 KiB
QML
// Copyright (C) 2024 The Qt Company Ltd.
|
|
// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause
|
|
|
|
import QtQuick
|
|
import QtGrpc
|
|
import QtQuick.Controls
|
|
import QtQuick.Layouts
|
|
|
|
import qtgrpc.examples
|
|
import qtgrpc.examples.magic8ball
|
|
|
|
ApplicationWindow {
|
|
id: root
|
|
|
|
property answerRequest answerReq
|
|
property string errorText: ""
|
|
property int errorCode: 0
|
|
|
|
//! [requestAnswerFunction]
|
|
function requestAnswer(question: string): void {
|
|
//! [requestAnswerFunction]
|
|
root.errorText = "";
|
|
magicBall.startWaiting();
|
|
|
|
//! [requestAnswerFunctionBody]
|
|
root.answerReq.question = question;
|
|
grpcClient.answerMethod(root.answerReq, finishCallback, errorCallback, grpcCallOptions);
|
|
}
|
|
//! [requestAnswerFunctionBody]
|
|
|
|
function finishCallback(response: answerResponse): void {
|
|
magicBall.addAnswer(response.message);
|
|
}
|
|
|
|
function errorCallback(error): void {
|
|
// error is received as a JavaScript object, but it is a QGrpcStatus instance
|
|
magicBall.cancelAnimation();
|
|
console.log(
|
|
`Error callback executed. Error message: "${error.message}" Code: ${error.code}`
|
|
);
|
|
root.errorText = error.message;
|
|
root.errorCode = error.code;
|
|
}
|
|
|
|
minimumWidth: rootLayout.implicitWidth + rootLayout.anchors.margins * 2
|
|
minimumHeight: rootLayout.implicitHeight + rootLayout.anchors.margins * 2
|
|
|
|
visible: true
|
|
title: qsTr("Magic-8-ball Qt GRPC Example")
|
|
font.pointSize: 18
|
|
|
|
//! [channelOptions]
|
|
GrpcHttp2Channel {
|
|
id: grpcChannel
|
|
hostUri: "http://localhost:50051"
|
|
// Optionally, you can specify custom channel options here
|
|
// options: GrpcChannelOptions {}
|
|
}
|
|
//! [channelOptions]
|
|
|
|
//! [exampleServiceClient]
|
|
ExampleServiceClient {
|
|
id: grpcClient
|
|
channel: grpcChannel.channel
|
|
}
|
|
//! [exampleServiceClient]
|
|
|
|
//! [callOptions]
|
|
GrpcCallOptions {
|
|
id: grpcCallOptions
|
|
deadlineTimeout: 6000
|
|
}
|
|
//! [callOptions]
|
|
|
|
ColumnLayout {
|
|
id: rootLayout
|
|
anchors.margins: 10
|
|
anchors.fill: parent
|
|
spacing: 12
|
|
|
|
MagicText {
|
|
color: "black"
|
|
text: qsTr("Ask the ball a yes-no question and press the button.")
|
|
}
|
|
|
|
MagicBall {
|
|
id: magicBall
|
|
Layout.alignment: Qt.AlignCenter
|
|
}
|
|
|
|
TextField {
|
|
id: questionInput
|
|
Layout.alignment: Qt.AlignCenter
|
|
Layout.minimumWidth: 300
|
|
leftPadding: 10
|
|
rightPadding: 10
|
|
placeholderText: qsTr("Type here a question...")
|
|
}
|
|
|
|
Button {
|
|
onClicked: root.requestAnswer(questionInput.text)
|
|
enabled: magicBall.canRequestAnswer
|
|
Layout.alignment: Qt.AlignCenter
|
|
leftPadding: 16
|
|
rightPadding: 16
|
|
text: qsTr("Ask")
|
|
}
|
|
|
|
MagicText {
|
|
visible: root.errorText
|
|
text:
|
|
qsTr("Error: %1\n%2")
|
|
.arg(root.errorText)
|
|
.arg(root.errorCode == QtGrpc.StatusCode.Unavailable
|
|
? qsTr("Please, restart the server")
|
|
: "")
|
|
}
|
|
}
|
|
}
|