QTとJavaScript間のインタラクティブデータの実装

QTとJavaScript間のインタラクティブデータの実装

1. QTからJSへのデータフロー
1. QTはJS関数を呼び出し、JSはパラメータを通じてQTの値を取得します。
2. JSがQTの関数を呼び出し、QT関数の戻り値がJSに入る
2. JSからQTへのデータフロー
1. JSはQTの関数を呼び出し、QTは仮パラメータを通じてJSの値を取得します。
2. QTがJS関数を呼び出し、JS関数の戻り値がQTに入る

1. QTは配列をJSに渡す

int、bool、string、double などの基本型を直接渡すことができます。

qt が js に配列を渡す場合、配列を QJsonArray に変換し、次に QJsonArray を QString に変換する必要があります。このようにして、js は基本型の文字列を受け取り、この文字列は js 内の標準の js 配列に直接なります。

QT コード例: js 関数を呼び出し、配列をパラメータとして js 関数に渡す

    //方法 1: QJsonArray を構築し、それを QString に変換する
    QJsonArray ja;
    ja << 3 << 4 << 5;
    QString jpar = QString(QJsonDocument(ja).toJson());
    QString cmd = QString("qtPara(%0)").arg(QString(QJsonDocument(ja).toJson()));
    //方法2: 配列を文字列として直接書き込む
// QString cmd = QString("qtPara([13,14,15])");
 
    //js 関数を実行します webView->page()->runJavaScript(cmd);

上記のコードによって呼び出される JavaScript 関数は次のとおりです。

 関数 qtPara(numList)
 { 
  alert("js alert: " + numList); //qt によって送信された配列全体を表示します alert("js alert[0]: " + numList[0]); //qt によって送信された配列の 0 番目の要素を表示します }

2. JSは配列をQTに渡す

JSがQTに配列を渡すと、QTはこの値をQJsonArrayに変換します。

JSは任意のJSオブジェクトをQTに渡すこともできるので、QTはそれをQJsonObjectに変換する必要がある。

QT終了サンプルコード:

    QString cmd = QString("jsString()");
 
    webView->page()->runJavaScript(cmd, [](const QVariant &v)
    {
        //ケース 1: js が数値を返す場合 qDebug() << "qt call js = " << v.toDouble();
        //ケース 2: js が文字列値を返す場合 qDebug() << "qt call js = " << v.toString();
        //ケース 3: js が js 配列を返す場合 QJsonArray ja = v.toJsonArray();
        qDebug() << "j[0] = " << ja.at(0).toDouble();
        //ケース 4: js が js オブジェクトを返す場合 QJsonObject jo = v.toJsonObject();
        qDebug() << jo;
    });

上記のコードによって呼び出される JS 関数:

// var jArr = [120.123456789, 22, 33, 44]; //js配列
 // var jObj = {"num":[120.123456789, 22, 33, 44], "name":"Tom"}; //json
var jNum = 120.1234567;
 関数 jsString()
 {
   アラート("jsString");
   //jNum を返します。
   //jArr を返します。
   //jObj を返します。
 }

3. JSはあらゆるタイプのデータをQTに渡す

QT側はQVariant型でそれを受け取り、この値をqDebugすると、このJS値がQVariantとしてカプセル化されていることがわかります。

たとえば、JS は QT に次のような値を返します。これは JS オブジェクトの配列で、各要素は Point オブジェクトであり、この Point オブジェクトには lng 属性値と lat 属性値があります。

パス = [新しいポイント(116.387112,39.920977), 新しいポイント(116.387112,39.920977)];

QT はこれを受信すると、次のように qDebugs を実行します。

QVariant(QVariantList,
(QVariant(QVariantMap, QMap(("lat", QVariant(double, 39.921))("lng", QVariant(double, 116.387)))),
QVariant(QVariantMap、QMap(("lat", QVariant(double, 39.921))("lng", QVariant(double, 116.387))))))

私たちは、

① QTはJSオブジェクト配列をQVariantListにカプセル化します。つまり、QList<QVariant>です。

② このリストの各メンバーはQTによってQVariantMapにカプセル化されます。つまり、QMap<QString, QVariant>

③ 各マップのキーはQString、値はQVariant、このQVariantはdoubleです。

上記の分析手順を実行すると、JS から QT に送信されたデータを簡単に解析できます。

QT と JavaScript 間のインタラクティブ データの実装に関するこの記事はこれで終わりです。QT と JavaScript のインタラクションに関する関連コンテンツをさらにご覧になりたい場合は、123WORDPRESS.COM の以前の記事を検索するか、以下の関連記事を引き続きご覧ください。今後も 123WORDPRESS.COM をよろしくお願いいたします。

以下もご興味があるかもしれません:
  • PyQt5 の QWebEngineView を JavaScript と連携させる方法

<<:  Linux における「/」と「~」の違いの詳細な説明

>>:  MySQL 5.7 の sql_mode のデフォルト値によって生じる落とし穴と解決策

推薦する

Dockerfile ビルド中に発生する「/bin/sh: pip: コマンドが見つかりません」という問題の解決方法

記述した Dockerfile の内容は次のとおりです。 Python:3.6.8 から pip i...

Dockerはコンテナを通じてイメージを生成し、詳細にDockerCommitを送信します

目次ローカルでコンテナを作成した後、このコンテナに基づいてローカル イメージを作成し、このイメージを...

JS ベースのページフローティングボックスを実装するためのサンプルコード

スクロール バーを下に引くと、主にposition:fixed;スタイルにより、フローティング ボッ...

MySQL マスタースレーブレプリケーションと読み取り書き込み分離の詳細な説明

記事マインドマップマスター/スレーブ レプリケーションと読み取り/書き込み分離を使用する理由は何です...

MySQLにおける静的変数の役割の詳細な説明

MySQLにおける静的変数の役割の詳細な説明静的変数の使用 静的変数サンプルコード: 関数テスト()...

MySQL のデータ統計に関するヒント

よく使用されるデータベースである MySQL では、多くの操作が必要です。デジタル操作には非常に便利...

Raspberry Pi 3B+ に 64 ビット Ubuntu システムと Docker ツールをインストールする詳細な手順

Raspberry Pi 3B に 64 ビット アプリケーション (64 ビット JDK など) ...

アルバムと写真をアルバムに保存するためのWeChatアプレット

私は現在、Xiao Nian Gao に似たビデオおよびツール アプリを開発しています。ユーザーが作...

ミニプログラム録画機能の実装

序文ミニプログラムを開発する過程では、録音機能を実装し、録音を再生し、録音をサーバーにアップロードす...

文字列の GBK および GB2312 エンコードとデコードのフロントエンド実装 (概要)

序文プロジェクトを開発しているときに、かなり厄介な問題に遭遇しました。この製品では、判断のためにブラ...

elementui での el-cascader カスケードセレクタの実践

目次1. 効果2. メインコード1. 効果機能: インターフェイスから取得したデータを使用してオプシ...

Vueスロットの実装原理についての簡単な説明

目次1. サンプルコード2. 現象を通して本質を見抜く3. 実施原則4. 親コンポーネントのコンパイ...

MySQL をベースにしたシンプルな検索エンジンを実装する

目次MySQL ベースの検索エンジンの実装1. ngram全文パーサー2. 全文インデックスを作成す...

MySQL マスタースレーブ構築(複数のマスターと 1 つのスレーブ)の実装アイデアと手順

背景:最近、同社のプロジェクトは同時実行のプレッシャーに耐えられないようなので、最適化が差し迫ってい...

MySQL パーティションテーブルのベストプラクティスガイド

序文:パーティショニングはテーブル設計パターンです。一般的に、テーブル パーティショニングとは、条件...