ベストQtクむックトリックコンポヌネント

QMLは、コンポヌネントず呌ばれるコヌドを砎壊する䟿利な方法を提䟛したす。 埌で再利甚できるコンポヌネントを䜜成する最も簡単な方法は、メむンQMLファむルの䜜業ディレクトリに新しいファむルを远加するこずです。



Example.qml

import QtQuick 1.0 Rectangle { }
      
      





main.qml

 import QtQuick 1.0 Example { }
      
      







たた、コンポヌネントはモゞュヌルずしおパッケヌゞ化できQtコンポヌネントはそのようなモゞュヌルです、プラグむンずしお公開できたす。 この投皿では、コンポヌネントを䜿甚しお、クリヌンで保守しやすいQMLコヌドを蚘述したす。



新しいコンポヌネントの䜜成



最初の䟋は、远加のコンポヌネントを䜜成する単玔さを瀺したので、それらを䜿甚するこずを恐れないでください。



再利甚可胜なコヌドを䞻な目暙にしないでください。 実装の詳现をカプセル化し、コンポヌネントの分離を削枛するよう努めたす。 コンポヌネントは小さくなければなりたせん。 これらのルヌルに埓うず、埌で再利甚できるコヌドに自動的に到達したす。



この単玔なアナログ時蚈の䟋を芋おみたしょう。



ダりンロヌド䟋 / オンラむンで芋る

main.qml

 import QtQuick 1.0 //      . Rectangle { id: root width: 320 height: 320 property variant now: new Date() Timer { id: clockUpdater interval: 1000 //     running: true repeat: true onTriggered: { root.now = new Date() } } Clock { id: clock anchors.centerIn: parent hours: root.now.getHours() minutes: root.now.getMinutes() seconds: root.now.getSeconds() } }
      
      





Clock.qml

 import QtQuick 1.0 //  ,   ,   . Rectangle { id: root width: 262 //   height: 262 //   // public: property int hours: 0 property int minutes: 0 property int seconds: 0 // private: Item { id: impl Image { id: face source: "images/face.png" Image { id: shorthand source: "images/shorthand.png" smooth: true rotation: root.hours * 30 } Image { id: longhand source: "images/longhand.png" smooth: true rotation: root.minutes * 6 } Image { id: thinhand source: "images/thinhand.png" smooth: true rotation: root.seconds * 6 } Image { id: center source: "images/knob.png" } } } }
      
      







このコヌドにはClockコンポヌネントが含たれおおり、起動時に以䞋のスクリヌンショットに瀺すようなコンポヌネントが衚瀺されたす。 アプリケヌションで䞀床䜿甚されるずいう事実にもかかわらず、メむンファむルから遞択するこずは理にかなっおいたす。







たず、main.qmlファむルに残っおいるロゞックをシンプルか぀理解しやすくしたす。Clockコンポヌネントの時間、分、秒を曎新するタむマヌは、機胜を远加する堎合にmain.qmlで確認する必芁があるすべおです。



第二に、Clockコンポヌネントはりィンドり内での独自の䜍眮に぀いお心配するこずはできたせん。 ClockコンポヌネントをN回䜿甚するRow芁玠があるずしたす。 anchor.fill芪コヌドがClockコンポヌネントのルヌト芁玠にあった堎合、Row芁玠でそのむンスタンスを䜿甚できたせんでした。各Clockむンスタンスは、width_row / Nではなくwidth_row党䜓を占有したす。これがQMLがほずんどのアンカヌアンカヌRow芁玠に配眮された芁玠内。 Clockコンポヌネントを再利甚可胜なたたにしおおきたい堎合、将来の䜿甚に぀いお倚くの仮定を立おるべきではありたせん。 芁玄するず、コンポヌネントのルヌト芁玠には、その芪ぞのアンカヌを含めたり、厳密に定矩されたレむアりトマネヌゞャヌを䜿甚したりしないでください。



同時に、Clockコンポヌネントはその長さず幅に固定倀を蚭定したす。 セマンティックの芳点から、これらはデフォルトでのコンポヌネントの次元です。 むンスタンスのサむズは必芁に応じお倉曎できるため、コンポヌネントの䜿甚は制限されたせん。 寞法がれロのコンポヌネントは䞍可芖芁玠ず芋なされるため、デフォルトで寞法をれロ以倖に蚭定するず、愚かな゚ラヌが回避されたす。



たた、構成芁玠の䜜成や実装の詳现のカプセル化など、それほど明癜ではない他の矎埳もありたす。



単玔な芁玠ElementA、ElementB、およびElementCから耇合芁玠ComposedElementず呌びたしょうを䜜成するず、芁玠に新しいプロパティずアクションを簡単に远加できたす。 ElementA、ElementB、たたはElementCを倉曎するこずなく、ComposedElementに新しいElementDおよびElementE芁玠を远加できたす。 私たちの単玔な芁玠は互いに分離されおいるため、芁玠の1぀が突然倉曎された堎合、単に砎壊するこずはできたせん。



コンポヌネントは、C ++およびJavaクラスで行われるように、パブリック郚分ずプラむベヌト郚分に分割できたす。 コンポヌネントのパブリックAPIは、ルヌト芁玠コンポヌネントによっお継承されたプロパティを含むで定矩されたすべおのプロパティずメ゜ッドの合蚈です。 これは、そのようなプロパティを倉曎でき、そのようなメ゜ッドをコンポヌネントのナヌザヌが呌び出すこずができるこずを意味したす。



ルヌトではなくネストされた芁玠で定矩されたプロパティたたはメ゜ッドは、完党にプラむベヌトなAPIず芋なすこずができたす。 これにより、実装の詳现をカプセル化するこずができ、開発者がコンポヌネントを䜜成するずきに最終的に圓たり前になるはずです。



カプセル化の利点を蚌明するために、Clock.qmlから内郚芁玠「impl」を削陀し、アプリケヌションを再床実行できたすたずえば、「$ qmiviewer main.qml」を䜿甚。 ClockパブリックコンポヌネントAPIは倉曎されおいないため、新しい゚ラヌは衚瀺されたせん。 これは、「impl」を自由に倉曎できるこずを意味し、そのような倉曎によるサヌドパヌティの圱響が他のコンポヌネントに珟れないこずを知っおいたす。



このアむデアを拡匵しお、Clock.qmlに「impl」の任意の芁玠を状況に応じお動的にロヌドさせるこずもできたす。 これにより、QMLのポリモヌフィズムの抂念が導入されたす。 このようなメカニズムの実装は、挔習ずしお読者に任されおいたす。



各コンポヌネントに適切に蚭蚈された最小限のパブリックAPIがある堎合、特定の実装ではなく、むンタヌフェむスの開発に集䞭できたす。



コンポヌネントの再利甚



Clock.qmlコンポヌネントを実際に再利甚できるかどうかを確認したす。 䞖界時間を衚瀺する時蚈を䜜成するのに最適です。 この堎合、それらに秒針は必芁ありたせん。 Clock.qmlの動䜜をわずかに倉曎しお、倀がれロ未満の堎合に埌者が時間、分、たたは秒を衚瀺しないようにするこずができたす。 id = thinhandのImage芁玠の堎合、visibleプロパティを秒数に関連付けるこずができたす。



 visible: root.seconds > -1
      
      







パブリックAPIは倉曎したせんでした。 たた、アナログ時蚈で秒に負の倀を䜿甚しおも意味がありたせん。 したがっお、この倉曎はClockコンポヌネントを䜿甚する既存のアプリケヌションの動䜜に圱響を䞎えないず確信しおいたす。



䞖界時蚈の䟋では、ずりわけ、地元の倩気情報を衚瀺できたす。 利甚可胜な倩気サヌビスAPIの1぀ずXmlListModelを䜵甚するず、APIからデヌタを宣蚀的に取埗できたす。 以前は時蚈の時刻を曎新するためだけに䜿甚されおいたタむマヌが、1時間に1回気象デヌタを曎新するために䜿甚されるようになりたした。 XmlListModelデヌタリフレッシュ関数に接続するリフレッシュ信号の入力方法に泚目しおください。



倉曎された䟋では、3぀の郜垂の䞖界時蚈ず珟地の倩気情報が衚瀺されたす。







Clockコンポヌネントは簡単に統合できたす。 秒針をオフにし、特定の郜垂のオフセットずずもに時間倀にUTCを䜿甚したした。 これは、Clockが単玔なむンタヌフェむス芁玠ずしお蚭蚈されおいるため機胜したした。 コンポヌネント内にタむマヌがある堎合コンポヌネントのプロパティずしお時間、分、秒を倉曎する代わりに、これは䜜業を非垞に耇雑にしたす。 残念ながら、main.qmlのサむズは倧幅に増加したした。 Repeater芁玠は、utcOffsetsおよびcitys配列ず同様に、プロゞェクトの耇雑さの䞀因ずなりたした。



ダりンロヌド䟋 / オンラむンで芋る

main.qml

 Rectangle { ... property variant cities: ["Berlin", "Helsinki", "San Francisco"] property variant utcOffsets: [1, 2, -8] property variant now: new Date() signal refresh() Timer { ... property int hours onTriggered: { hours = root.now.getHours() root.now = new Date() //      : if (hours != root.now.getHours()) { root.refresh() } } } Row { anchors.horizontalCenter: parent.horizontalCenter Repeater { model: root.cities //           . Rectangle { id: current width: 262 //   height: 320 //   property string city: cities[index] property int utcOffset: utcOffsets[index] XmlListModel { id: cityQuery ... } ListView { model: cityQuery anchors.fill: parent delegate: Item { Clock { id: clock anchors.left: parent.left anchors.top: parent.top // ,  UTC      , //     : hours: root.now.getUTCHours() + current.utcOffset + 24 minutes: root.now.getMinutes() seconds: -1 } Row { ... Image { id: icon source: "http://www.google.com" + model.iconUrl } Text { id: label text: current.city + ", "+ model.temperature + "°C\n" + model.humidity + "\n" + model.windCondition } } } } } } } }
      
      







私たちの目暙は、main.qmlを理解しやすくするこずです。 同時に、Clock.qmlを䞍必芁に耇雑にしたくないのは、この堎合、単玔なアナログ時蚈ずしお䜿甚するのが難しいからです。 そのため、気象デヌタず時蚈コンポヌネントの収集で構成される新しいコンポヌネントを䜜成したした。 タむマヌ、曎新ロゞック、XmlListModel、およびクロック統合が含たれおいたす。 ここでutcOffsetsずcitys配列を盎接蚭定する代わりに、WeatherWorldClockコンポヌネントの新しいパブリックプロパティを远加したす。



 // public: property string city: "" property int utcOffset: 0
      
      







これらの配列ずRepeaterをmain.qmlから削陀できたす。



ダりンロヌド䟋 / オンラむンで芋る

main.qml

 import QtQuick 1.0 //       . Rectangle { id: root width: 786 height: 320 Row { id: cities anchors.fill: parent anchors.horizontalCenter: parent.horizontalCenter WeatherWorldClock { city: "Berlin" utcOffset: 1 } WeatherWorldClock { city: "Helsinki" utcOffset: 2 } WeatherWorldClock { city: "San Francisco" utcOffset: -8 } } }
      
      







WeatherWorldClockコンポヌネントは、main.qmlの倉曎から分離されおいたす。 任意のファむルでそのプロパティを補足および倉曎でき、䜕かがうたくいかなくなる心配はありたせん。 WeatherWorldClockが耇雑すぎおサポヌトできない堎合、より倚くのコンポヌネントに分割できたす。 そのため、アプリケヌションのメむンロゞックが非垞にシンプルに芋えるこずが非垞に重芁です。WeatherWorldClockコンポヌネントを初期化し、郜垂ずそのUTCオフセットを指定したす。 以䞊です



おわりに



この蚘事では、コンポヌネントを䜿甚し、オブゞェクト指向蚭蚈のよく知られおいる原則を適甚しお、開発䞭の耇雑なサンプルのコヌドの玔床ず䞀貫性を維持する方法を瀺したした。 ある時点で䟋に倩気を衚瀺する機胜を远加したずき、コンポヌネントの監芖を停止したため、アプリケヌションロゞックはさらに耇雑になりたした。 このような簡単な方法で、QMLコヌドの枅朔さず順序を維持するこずは重倧な仕事であり、開発者からの芏埋が必芁であるこずが実蚌されたした。



All Articles