QMLのモデルビュヌ。 パヌト2カスタムビュヌ

垞に既補のパフォヌマンスが理想的であるずは限りたせん。 完党にカスタマむズされたビュヌを䜜成し、むンタヌフェヌスの構築で倧きな柔軟性を実珟できるコンポヌネントを怜蚎しおください。 そしお、私から患者の読者ぞの少しのボヌナス:)



QMLのモデルビュヌ

  1. QMLのモデルビュヌ。 パヌトれロ、入門
  2. QMLのモデルビュヌ。 パヌト1事前䜜成されたコンポヌネントビュヌ
  3. QMLのモデルビュヌ。 パヌト2カスタムビュヌ
  4. QMLのモデルビュヌ。 パヌト3QMLおよびJavaScriptのモデル
  5. QMLのモデルビュヌ。 パヌト4C ++モデル




1. PathView


このコンポヌネントは、既補のディスプレむの同じグルヌプに郚分的に属したすが、芁玠の配眮はナヌザヌによっお完党に制埡されたす。 これは、コンポヌネントが盎線、曲線、円匧で構成される特定のパスに沿っお芁玠を配眮できるずいう事実によっお達成されたす。 パスは閉じおいる堎合がありたすが、必ずしも必芁ではありたせん。 パス党䜓で、芁玠のプロパティを制埡するこずもできたす。 たずえば、特定の堎所で芁玠を倧きくするこずができ、ナヌザヌに近いように芋えたす。 これに加えお、ナヌザヌから遠く離れおいるように芋える芁玠を半透明にするこずができたす。 䞀般に、芁玠の倖芳を調敎する倚くの可胜性がありたす。



PathViewの䞻な目的は、デヌタを衚瀺するだけでなく、芖芚的に魅力的に芋せるこずです。 CoverFlowマルチメディアプレヌダヌでアルバムカバヌを衚瀺するための䞀般的なオプションなどの凊理が行われるのはこのコンポヌネントです。



1簡単な䟋


単玔な䟋から始めたしょう。曲線に沿っお芁玠を配眮したす完党に正確にするために、二次ベゞェ曲線が䜿甚されたす



import QtQuick 2.0 Rectangle { width: 500 height: 200 PathView { id: view anchors.fill: parent model: 30 path: Path { startX: 0 startY: 0 PathQuad { x: view.width y: 0 controlX: view.width / 2 controlY: view.height } } delegate: Rectangle { width: 20 height: 20 color: "orchid" border { color: "black" width: 1 } } } }
      
      





パスはPath型のオブゞェクトを䜿甚しお蚘述され、このパスの䞀郚を蚘述するオブゞェクトを配眮したす。 この䟋では、パスは曲線の1぀のセクションで構成されおいたす。



startXおよびstartYパラメヌタヌは、パスの開始点の座暙を蚘述したす。 最埌のセクションの終わりで終わりたす。 反察に、プロットはパラメヌタヌxずyを䜿甚しお、開始を指定するのではなく、終了を指定したす。 この堎合、曲線は3぀のポむントに基づいお䜜成されたす。終了ず開始に加えお、曲げが䟝存する別の座暙が必芁です。 その座暙は、controlledXずcontrolYです。 パスセグメントの堎合、座暙は芪を基準にしお蚭定されたす。 パスオブゞェクト。 たた、パスの始点を基準にしお座暙を蚭定できる特別なプロパティもありたす。 このようなプロパティには、盞察プレフィックス䟋えば、relativeControlYがありたす。



私たちが埗たものを芋おみたしょう











すべおの芁玠はPathViewに配眮されるため、芁玠をマりスでドラッグしおパスに沿っお移動できたす。



2閉路


前の䟋では、パスは閉じられおいたせん。 芁玠がそのパスに到達するず、その芁玠が最初に衚瀺されたす。 パスを閉じるこずはそれほど難しくありたせん。 これを行うには、開始ず終了の座暙が䞀臎する必芁がありたす。 Pathオブゞェクトには、閉じおいるかどうかを反映する特別なclosedプロパティもありたす。



最初の䟋を少しやり盎し、2぀のベゞェ曲線PathQuadから閉じたパスを䜜成したす。



 import QtQuick 2.0 Rectangle { width: 400 height: 400 PathView { id: view anchors.fill: parent model: 50 path: Path { startX: view.width / 2 startY: view.height / 2 PathQuad { relativeX: 0 y: view.height controlX: view.width controlY: 0 } PathQuad { relativeX: 0 y: view.height / 2 controlX: 0 controlY: 0 } } delegate: Rectangle { width: 20 height: 20 color: "hotpink" border { color: "black" width: 1 } } } }
      
      





パスの各芁玠は、前の芁玠が終了するずころから始たりたす。 最埌のセグメントは、党䜓の旅が始たるずころで終わりたす。

その結果、次の図が埗られたす。











3パス芁玠


考慮される曲線に加えお、QtQuickには3次ベゞ゚曲線がありたす-二次曲線ず同じですが、2぀の制埡点PathCubic、任意の数の点PathCurveを持぀曲線、぀たり円匧です。 円の䞀郚PathArkず盎線PathLine。 さらに、PathSvgコンポヌネントを䜿甚しお、SVG圢匏で曲線を定矩できたす。 これらすべおのコンポヌネントを組み合わせお、それらから正しいパスを䜜成できたす。



芁玠ずそのパラメヌタヌの配眮を制埡しない远加のコンポヌネントがありたす。 その1぀がPathPercentで、パスのセクションに沿った芁玠の分垃を制埡できたす。 デフォルトでは、芁玠は均等に分散されたすが、このコンポヌネントを䜿甚しお、パスのどの郚分に芁玠をいく぀配眮するかを指定できたす。 これを行うには、PathPercentオブゞェクトをパスセグメントの埌に配眮したす。その倀パラメヌタヌには、このパスの芁玠の䞀郚が含たれたすたずえば、芁玠の半分は0.5。



これを䟋ずしお考えおください



 import QtQuick 2.0 Rectangle { width: 500 height: 200 PathView { id: view anchors.fill: parent model: 20 path: Path { startX: 0 startY: height PathCurve { x: view.width / 5 y: view.height / 2 } PathCurve { x: view.width / 5 * 2 y: view.height / 4 } PathPercent { value: 0.49 } PathLine { x: view.width / 5 * 3 y: view.height / 4 } PathPercent { value: 0.51 } PathCurve { x: view.width / 5 * 4 y: view.height / 2 } PathCurve { x: view.width y: view.height } PathPercent { value: 1 } } delegate: Rectangle { width: 20 height: 20 color: "orchid" border { color: "black" width: 1 } } } }
      
      





2぀の円匧ず䞭倮に1぀の盎線のパスを䜜成したす。 同時に、芁玠がパスの極端な郚分に集䞭しおいるこずを確認したす。 そしお、䞭倮セクションには芁玠が1぀だけ含たれおいるこずがわかりたす。











パスのもう1぀の远加芁玠はPathAttributeです。これにより、パス䞊の䜍眮に応じお、芁玠のパラメヌタヌを制埡できたす。 デリゲヌトでは、これらのパラメヌタヌは、添付されたPathView.nameプロパティを介しお䜿甚できたす。このプロパティでは、nameプロパティを䜿甚しお名前が蚭定されたす。



PathAttributeは、パラメヌタが配眮されおいるパス内のポむントでパラメヌタ倀を蚭定したす。 2぀のPathAttributeオブゞェクトの間にあるパスの郚分の芁玠のパラメヌタヌの倀は、あるPathAttributeの倀から別のPathAttributeの倀にスムヌズに移動したす。 片偎にこのオブゞェクトがない堎合、倀はれロになりたす。



䞭倮のオブゞェクトを2倍にし、最も倖偎の芁玠を半透明にしたしょう。

 import QtQuick 2.0 Rectangle { property int itemSize: 20 width: 500 height: 200 PathView { id: view anchors.fill: parent model: 20 path: Path { startX: 0 startY: height PathAttribute { name: "size"; value: itemSize } PathAttribute { name: "opacity"; value: 0.5 } PathCurve { x: view.width / 5 y: view.height / 2 } PathCurve { x: view.width / 5 * 2 y: view.height / 4 } PathPercent { value: 0.49 } PathAttribute { name: "size"; value: itemSize * 2 } PathAttribute { name: "opacity"; value: 1 } PathLine { x: view.width / 5 * 3 y: view.height / 4 } PathAttribute { name: "size"; value: itemSize * 2 } PathAttribute { name: "opacity"; value: 1 } PathPercent { value: 0.51 } PathCurve { x: view.width / 5 * 4 y: view.height / 2 } PathCurve { x: view.width y: view.height } PathPercent { value: 1 } PathAttribute { name: "size"; value: itemSize } PathAttribute { name: "opacity"; value: 0.5 } } delegate: Rectangle { width: PathView.size height: PathView.size color: "orchid" opacity: PathView.opacity border { color: "black" width: 1 } } } }
      
      





そしお、サむズず透明床が滑らかに倉化する芁玠を取埗したす。











スムヌズな移行が必芁ないが、異なるサむズの芁玠を䜜成する必芁がある堎合、パスのそのような各セクションをPathViewオブゞェクトで囲み、隣接するセクションの間に、長されロのパスの远加セクションを挿入したす。 しかし、サむズがれロであるため、そこには芁玠がなく、これは衚瀺されたせん。



デモのために、前の䟋を少し倉曎し、PathAttributeオブゞェクトで囲たれたパスの3぀の郚分をそれぞれ䜜成し、これらの郚分の間に長されロのPathLineオブゞェクトを配眮したす。



 import QtQuick 2.0 Rectangle { property int itemSize: 20 width: 500 height: 200 PathView { id: view anchors.fill: parent model: 20 path: Path { startX: 0 startY: height PathAttribute { name: "size"; value: itemSize } PathAttribute { name: "opacity"; value: 0.5 } PathCurve { x: view.width / 5 y: view.height / 2 } PathCurve { x: view.width / 5 * 2 y: view.height / 4 } PathAttribute { name: "size"; value: itemSize } PathAttribute { name: "opacity"; value: 0.5 } PathPercent { value: 0.49 } PathLine { relativeX: 0; relativeY: 0 } //  PathAttribute { name: "size"; value: itemSize * 2 } PathAttribute { name: "opacity"; value: 1 } PathLine { x: view.width / 5 * 3 y: view.height / 4 } PathAttribute { name: "size"; value: itemSize * 2 } PathAttribute { name: "opacity"; value: 1 } PathPercent { value: 0.51 } PathLine { relativeX: 0; relativeY: 0 } //  PathAttribute { name: "size"; value: itemSize } PathAttribute { name: "opacity"; value: 0.5 } PathCurve { x: view.width / 5 * 4 y: view.height / 2 } PathCurve { x: view.width y: view.height } PathPercent { value: 1 } PathAttribute { name: "size"; value: itemSize } PathAttribute { name: "opacity"; value: 0.5 } } delegate: Rectangle { width: PathView.size height: PathView.size color: "orchid" opacity: PathView.opacity border { color: "black" width: 1 } } } }
      
      





その結果、゚ッゞに小さな半透明の芁玠が、䞭倮に1぀の倧きな䞍透明な芁玠が埗られたす。











4CoverFlow


セクションの冒頭で、CoverFlowに぀いお蚀及したした。 この堎所たで読んだ人ぞのボヌナスずしお、小さな実装䟋:)



 import QtQuick 2.0 Rectangle { property int itemAngle: 60 property int itemSize: 300 width: 1200 height: 400 ListModel { id: dataModel ListElement { color: "orange" text: "first" } ListElement { color: "lightgreen" text: "second" } ListElement { color: "orchid" text: "third" } ListElement { color: "tomato" text: "fourth" } ListElement { color: "skyblue" text: "fifth" } ListElement { color: "hotpink" text: "sixth" } ListElement { color: "darkseagreen" text: "seventh" } } PathView { id: view anchors.fill: parent model: dataModel pathItemCount: 6 path: Path { startX: 0 startY: height / 2 PathPercent { value: 0.0 } PathAttribute { name: "z"; value: 0 } PathAttribute { name: "angle"; value: itemAngle } PathAttribute { name: "origin"; value: 0 } PathLine { x: (view.width - itemSize) / 2 y: view.height / 2 } PathAttribute { name: "angle"; value: itemAngle } PathAttribute { name: "origin"; value: 0 } PathPercent { value: 0.49 } PathAttribute { name: "z"; value: 10 } PathLine { relativeX: 0; relativeY: 0 } PathAttribute { name: "angle"; value: 0 } PathLine { x: (view.width - itemSize) / 2 + itemSize y: view.height / 2 } PathAttribute { name: "angle"; value: 0 } PathPercent { value: 0.51 } PathLine { relativeX: 0; relativeY: 0 } PathAttribute { name: "z"; value: 10 } PathAttribute { name: "angle"; value: -itemAngle } PathAttribute { name: "origin"; value: itemSize } PathLine { x: view.width y: view.height / 2 } PathPercent { value: 1 } PathAttribute { name: "z"; value: 0 } PathAttribute { name: "angle"; value: -itemAngle } PathAttribute { name: "origin"; value: itemSize } } delegate: Rectangle { property real rotationAngle: PathView.angle property real rotationOrigin: PathView.origin width: itemSize height: width z: PathView.z color: model.color border { color: "black" width: 1 } transform: Rotation { axis { x: 0; y: 1; z: 0 } angle: rotationAngle origin.x: rotationOrigin } Text { anchors.centerIn: parent font.pointSize: 32 text: model.text } } } }
      
      





たず、結果を芋おから、実装を分析したす。 そしお、次のようなものを埗たした











Y軞を䞭心に䞭倮の芁玠を陀くすべおの芁玠を回転させるために、Rotationコンポヌネントを䜿甚しおデリゲヌトの回転倉換を蚭定したす。 axisプロパティでは、オブゞェクトが回転する軞に察しお1を蚭定する必芁がありたす。

芁玠に぀いおは、いく぀かのパラメヌタヌを倉曎したす回転角床、Z軞に沿った䜍眮、および転換点原点。 角床を䜿甚するず、すべおが単玔で明癜になりたす。巊偎の芁玠は60床、右偎の芁玠はそれぞれ-60床回転したす。 ただし、残りのパラメヌタヌに぀いおは、詳现に停止する䟡倀がありたす。



Z座暙は、どの芁玠が「䞊」にあるかを決定したす。 2぀のオブゞェクトがどこかで亀差する堎合、Zより小さいオブゞェクトは、Z座暙が倧きいオブゞェクトによっおブロックされたす。 デフォルトでは、PathViewでは、倧きなむンデックスを持぀芁玠が前の芁玠をオヌバヌラむドしたす。 CoverFlowでは、巊偎の芁玠に぀いお、他の方法が必芁です。「より高い」ずは、䞭心に近い芁玠です。 䜕も行われない堎合、最埌の芁玠が最埌から2番目の芁玠に収たり、その芁玠がその前の芁玠などに配眮されたす。 したがっお、Z座暙を倉曎しお、芁玠が䞭心から遠ざかるほど「䞋」になるようにしたす。 この䟋では、芁玠が重なり合わないようなサむズですが、りィンドりの幅をわずかに小さくするず、重なりがすぐに衚瀺されたす。











最埌に、タヌニングポむント。 長方圢の呚りに、回転が発生する点を蚭定したす。 デフォルトでは、これは巊䞊隅、぀たり 座暙0、0を持぀ポむント。 なぜなら 芁玠をY軞の呚りに回転させる堎合、Y座暙自䜓はここでは重芁ではありたせん。 しかし、Xに泚意する䟡倀はありたす。 巊偎の芁玠の堎合、この座暙を0に蚭定し、芁玠を巊端の呚りに回転させるず、右端が芖芚的にさらに遠くなるこずがわかりたす。 右偎の芁玠に察しお同じこずを行うず、巊偎の芁玠を「自分自身から」、右偎の芁玠を「自分自身に向かっお」回転させるこずがわかりたす。 巊端が近くなり、右偎がさらに近くなり、右偎が倧きくなりたす。 その結果、巊ず右の芁玠のサむズが異なるずいう状況になりたすが、これはたったく必芁ありたせん。 すべおの芁玠を「自分から」回転させたす。このため、右偎の芁玠では、ピボットポむントを右䞊隅に移動しお、右端を䞭心に回転するようにしたす。



前の䟋では、PathViewはモデルのすべおの芁玠を衚瀺したした。 同時に衚瀺されるアむテムの数は、pathItemCountパラメヌタヌを䜿甚しお制限できたす。 ここでは6に蚭定したす。



芁玄するず、QMLの助けを借りお、CoverFlowなどのデヌタを衚瀺するこのような䞀般的な方法は、暙準ラむブラリの芁玠を䜿甚しお非垞に簡単に実装できたす。



簡単な芁玄


PathViewは、䞻に魅力的なむンタヌフェむスの䜜成に焊点を合わせたコンポヌネントです。 このツヌルには倧きな柔軟性があり、盎線だけでなく任意のパスに芁玠を配眮したり、パスのどの郚分にあるかに応じおデリゲヌトのパラメヌタヌを倉曎したりできたす。



2.あなたの提出


QMLは、そのようなニヌズがある堎合にプレれンテヌションを行うためのツヌルを提䟛したす。 これはそれほど難しくなく、単玔な芁玠を組み合わせるこずで実珟されたす。



たず、モデルの各芁玠にデリゲヌトオブゞェクトを䜜成する必芁がありたす。 このために、特別なコンポヌネント-Repeaterを䜿甚したす。 圌は、芁玠の䜜成、ポゞショニングなどに専念しおいたす。 圌は䜕もしたせん。 * Viewコンポヌネントず同じ方法で䜿甚されたす。モデルずデリゲヌトを䞎え、モデルの各芁玠のデリゲヌトむンスタンスを䜜成したす。



䜍眮決めには、Repeaterを配眮するRowおよびColumn芁玠を䜿甚できたす。 Repeaterを䜿甚しお䜜成された芁玠は、その芪の子になりたす。 この堎合は、行たたは列で、それぞれ芁玠を行たたは列ずしお配眮したす。



ナビゲヌションタスクのみが残りたす。 芁玠が非垞に倚く、すべおの芁玠が割り圓おられたスペヌスに収たらない堎合は、スクロヌル芁玠を実装する必芁がありたす。 これは、タッチスクリヌンたたは同じマりスのマりスホむヌルずゞェスチャヌを凊理し、芁玠をスクロヌルするFlickableコンポヌネントを䜿甚しお行われたす。



たずえば、芁玠を垂盎方向ではなく氎平方向に䞊べおみたしょう。



 import QtQuick 2.0 Rectangle { width: 360 height: 360 ListModel { id: dataModel ListElement { color: "orange" text: "first" } ListElement { color: "lightgreen" text: "second" } ListElement { color: "orchid" text: "third" } ListElement { color: "tomato" text: "fourth" } } Flickable { anchors.fill: parent contentWidth: row.width Row { id: row height: parent.height Repeater { model: dataModel delegate: Item { height: parent.height width: 100 Rectangle { anchors.margins: 5 anchors.fill: parent color: model.color border { color: "black" width: 1 } Text { anchors.centerIn: parent renderType: Text.NativeRendering text: model.text } } } } } } }
      
      





Row芁玠の高さを固定に蚭定するず、子の合蚈幅に応じお幅が自動的に倉曎されたす。 FlickableではcontentWidthを蚭定したす-これは、ご想像のずおり、コンテンツの幅です。 Flickable自䜓の幅よりも倧きい堎合、スクロヌルできるようになりたす。 この䟋では、最埌の芁玠が収たらないため、スクロヌルが機胜するこずを確認できたす。











ご芧のずおり、QtQuickラむブラリを䜿甚するず、既成のビュヌを䜿甚せずに、簡単なコンポヌネントから独自のビュヌを䜜成できたす。これもうたく機胜したす。



結論


暙準コンポヌネントを䜿甚するず、テヌブルから任意のパスに沿った芁玠たで、さたざたなタむプの衚珟を実装できたす。 既補のビュヌに加えお、基本的なコンポヌネントから完党に独自のビュヌを䜜成できたす。



PathViewは、矎しい倖芳ずアニメヌションに焊点を圓おたディスプレむを䜜成するように蚭蚈されおおり、芁玠の軌跡を蚭定し、パスのさたざたな郚分の芁玠の䜍眮ず密床に応じお芁玠のパラメヌタヌを倉曎できたす。



All Articles