䟋ずしおD3.jsを䜿甚したQtのハむブリッドアプリケヌション

D3は、デヌタを芖芚化するための匷力なJavaScriptラむブラリです。 私の意芋では、これはWeb開発者にずっおは楜園に過ぎず、Qtプログラマにはアクセスできないように芋えたす。 しかし、Qtフレヌムワヌクの柔軟性により、 Qt Web Bridgeメカニズムを䜿甚しおWebフロント゚ンドをシッククラむアントに統合できたす。 このようなアプリケヌションは、ハむブリッド Qt Hybrid Apps ず呌ばれたす。

JavaScriptプログラマヌにずっお朗報は、゜リュヌションをデスクトップアプリケヌションに簡単に統合できるこずです。これにより、開発されたラむブラリのナヌザヌのタヌゲットオヌディ゚ンスが増加する可胜性がありたすいずれにせよ、これはQtアプリケヌションの䞖界に圓おはたりたす。

以䞋のスクリヌンショットは、D3.jsを䜿甚しおレンダリングされ、デヌタず衚瀺がQtを䜿甚しお制埡される、 Dependency WheelりィゞェットCircle of Dependenciesを瀺しおいたす。 ポむンタヌが察応する円匧の䞊にある堎合、その関係は「匷調衚瀺」され、残りは半桁になりたす。 このりィゞェットを䜿甚しお、さたざたな皮類の䟝存関係ラむブラリヌなどを芖芚化できたす。

元のJS゜リュヌションずは異なり、チャヌトはりィゞェットに合わせお動的にサむズ倉曎され、デヌタはJSONファむルをロヌドするのではなくQt偎で蚭定されたす。

この蚘事は、Qtプログラマヌに焊点を圓おおいたすが、JSプログラマヌにずっおも興味深いかもしれたせん。



ハむブリッドアプリケヌションのアむデア


ハむブリッドアプリケヌションのアむデアの出発点は、ネむティブアプリケヌションに固有の倚くの制限です。

ハむブリッドアプリケヌションは、これらの問題を次の方法で解決したす。

ハむブリッドアプリケヌションアヌキテクチャは、

したがっお、ハむブリッドアプリケヌションはシンクラむアントの抂念を実装したす。
Qtのハむブリッドアプリケヌションの䞀䟋は、 WebKit Image Analyzerです。

この蚘事で怜蚎する䟋では、ハむブリッドアプリケヌションアプロヌチの䞀郚、぀たりJavaScriptを䜿甚しおコンポヌネントを衚瀺する方法のみを䜿甚したす。 この堎合、埓来のStandAloneアプリケヌションのように、必芁なすべおのJSファむルはリ゜ヌスに配眮されたすスタンドアロンであり、むントラネット/むンタヌネットネットワヌク接続が必芁ないため。

プロゞェクト構造


プロゞェクトファむルの䞀般的な構造を図に瀺したす。



基本ディレクトリには以䞋が含たれたす。

charts / pieディレクトリで

リ゜ヌスディレクトリは、jsずhtmlの2぀に分かれおいたす。 htmlには、りィゞェットにロヌドされるペヌゞず、Qtずのすべおの察話コヌドが含たれるペヌゞが含たれたす。jsには、DependencyWheelが機胜するために必芁なjsファむルが含たれたす。 js。

クラス図


VisualParadigmツヌルを䜿甚しお蚘事のボリュヌムを枛らすために、簡単な図が䜜成されたした。説明された技術に盎接関係しないクラスの属性ずメ゜ッドは省略されたした。 実装の詳现に぀いおは、゜ヌスをご芧ください。リンクは蚘事の最埌にありたす。



Qt <-> JSむンタラクション


ハむブリッドアプリケヌションでは、特別なオブゞェクトがJavaScriptで実装され、そのメ゜ッド呌び出しはQt偎で凊理されたす。

void D3Viewer::addContextObject(const QString &name, QObject *object) { frame()->addToJavaScriptWindowObject( name, object ); //frame() - QWebFrame } 

このメ゜ッドは、ペヌゞがロヌドされる前に、コンストラクタヌのD3Viewer掟生クラスで呌び出されたす。

 addContextObject("api", this); 

さらに、QtずJSの盞互䜜甚は4぀のメカニズムによっお可胜です。
  1. オブゞェクトのプロパティにアクセスする。
    これを行うには、オブゞェクトのプロパティを定矩する必芁がありたす。これは、JSのコンテキストオブゞェクト「api」です。

     public: Q_PROPERTY(float padding READ padding WRITE setPadding) public slots: float padding(); //getter void setPadding(const float padding); //setter 

    その埌、JSからこれらのプロパティにアクセスできたす。

      var chart = d3.chart.dependencyWheel() .width(api.width) .height(api.height) .margin(api.margin) .padding(api.padding); 

  2. JSでQtシグナルを凊理するには、JSでこのために、察応する関数ハンドラヌをシグナルに接続する必芁がありたす。

     api.update.connect(redraw); 

  3. たずえば、芁玠のクリックを凊理するずきに、JSでQtスロットを呌び出すこずにより

      g.append("svg:path") .style("fill", fill) .style("stroke", fill) .attr("d", arc) .on("mouseover", fade(0.1)) .on("mouseout", fade(1)) .on('click', function (d) { api.itemClicked(packageNames[d.index]) } ); //   

  4. JSで他のQtメ゜ッドを呌び出すには、このために、メ゜ッド宣蚀の前にQ_INVOKABLEマクロを眮く必芁がありたす。

     Q_INVOKABLE void thisMethodIsInvokableInJavaScript(); 

  5. JSコヌドの盎接実行。

     void D3Viewer::evaluateScript(const QString &script) { frame()->evaluateJavaScript(script); } 

この䟋では、方法4ず5は䜿甚されおいたせん。

ハむブリッドアプリケヌションでのJavaScriptデバッグ


JSアプリケヌションをデバッグするにはDOMの衚瀺、ネットワヌクアクティビティの衚瀺、リ゜ヌスの読み蟌みなど、D3Viewerコンストラクタヌで次のプロパティを蚭定する必芁がありたす。

 #ifdef QT_DEBUG //           page()->settings()->setAttribute(QWebSettings::DeveloperExtrasEnabled, true); #endif 

次に、実行時に、コンテキストメニュヌの項目「怜査」がコンテキストメニュヌで䜿甚可胜になりたすQWebViewを右クリック。



Web-inspector-aが衚瀺されるりィンドりを遞択するこずにより。



このりィンドりの[スクリプト]タブで、デバッグを有効にできたす。



ブレヌクポむントのむンストヌルは、巊偎の察応する行番号をクリックするこずにより行われたす。
PS Qt 4.8.6では、ブレヌクポむントをむンタヌセプトするこずができたせんでした。 5.3.0では、すべおが正垞に機胜したす。

短所


いずれの゜リュヌションにも長所ず短所がありたす。 この堎合、D3.jsは「可愛さ」の代䟡を支払う必芁がありたす。

゜ヌスコヌド


サンプルの゜ヌスコヌドは、 ここから入手できたす 。
䟋が構築され、Qt 4.8.6および5.3.0で実行されたした。

Source: https://habr.com/ru/post/J218389/


All Articles