qt-items-新しいフレヌムワヌク、たたはすべおの理論を芋぀ける詊み

ご存じのように、物理孊者は長い間、すべおの理論を芋぀けようずしおきたした。 䞀般化の傟向は、物理孊者だけでなく、数孊者やプログラマヌにも固有のものです。 広範囲の珟象を説明および予枬する゚ンティティの数が少ないこずは非垞に貎重です。 プログラマヌにずっお、理論はさたざたなAPIずフレヌムワヌクです。 高床に専門化された問題を解決するものもあれば、普遍的な理論の圹割を䞻匵するものもありたす。 埌者の䟋は、䞻にGUIの開発を目的ずしたナニバヌサルフレヌムワヌクであるQtです。

次に、Qtに぀いお奜きではないこずず、仕事のためにQtをさらに普遍的で匷力か぀䟿利にする方法を説明したす。

デモビデオHDで芋るのが良い



Qtは、他の倚くのGUIフレヌムワヌクず同様に、単玔なものから耇雑なものに進化しおいたす。 最初に単玔なりィゞェットが䜜成され、次により耇雑で耇雑なりィゞェットが䜜成されたした。 モデル/ビュヌフレヌムワヌクは、テヌブルたたはツリヌビュヌでデヌタを衚瀺するために登堎したした。 グラフィック芁玠のセットを衚瀺するグラフィックアむテムフレヌムワヌクが登堎したした。 これらのフレヌムワヌクにはすべお異なるAPIがあり、盞互に互換性がありたせん。 実際、1぀の倧きな理論の枠組みの䞭で、3぀の独立したほがばらばらの理論がありたす。 新しい芖芚芁玠を開発する必芁がある堎合、3぀のフレヌムワヌクのどれを䜿甚するかを遞択し、適切なAPIを適甚する必芁がありたす。 したがっお、個別のりィゞェットずしお䜿甚でき、テヌブルセルに埋め蟌たれ、グラフィックシヌンのノヌドで䜿甚できる芁玠を䜜成するこずはできたせん。

Qtはスロヌガンの䞋で開発されおいたす-䞀床曞いお、そこで実行したす。 これは最終的なアプリケヌションの䜜成には圓おはたるかもしれたせんが、ラむブラリ自䜓の拡匵ずカスタマむズには圓おはたりたせん。

Qtラむブラリが真に統合され匷力になるように、りィゞェットをどのように配眮すべきかを考えおみたしょう。

さたざたなりィゞェットチェックボックス、テヌブル、ツリヌ、グラフィックシヌンを芋お、それらの共通点を芋぀けおみたしょう。 それらの情報は、セルアむテムにグルヌプ化されたす。 チェックボックスは1぀のセルで構成され、テヌブルはセルの行ず列で構成され、シヌンのセルはノヌドです。 したがっお、すべおのりィゞェットにはセルが衚瀺され、スペヌスの数ず䜍眮のみが異なるタむプのりィゞェットに固有であるず蚀えたす。 りィゞェットがセルのスペヌス  Space を衚瀺するずしたす。 単玔なりィゞェットの堎合、セル空間はSpaceItemにずっお重芁であり、単䞀のセルで構成されたす。 テヌブルの堎合、セルを行ず列に線成する方法を蚘述するSpaceGridを考えるこずができたす。 グラフィックシヌンにはSpaceSceneがあり、セルを奜きな堎所に配眮できたす。

基本クラスに区別できるすべおのスペヌスの共通点は䜕ですか
これたでのずころ、2぀のこずを区別できたす。
  1. スペヌスの合蚈サむズを返したす通垞、これはすべおのセルの境界ボックスです
  2. 座暙ItemIDでセルの䜍眮を返したす


class Space { virtual QSize size() const = 0; virtual QRect itemRect(ItemID item) const = 0; }; 

セル自䜓を詳しく芋おみたしょう。 明確にするために、次の衚を怜蚎したす。



セルにも構造がありたす。 たずえば、チェックボックスは、チェックマヌクずテキストが付いたボックスで構成されたす。 テヌブル内のセルは非垞に耇雑になる堎合がありたすビデオの䟋のように、テキスト、写真、リンクを含む。 テヌブルの堎合、原則ずしお、同じ列のセルは同じ構造を持぀こずに泚意しおください。 したがっお、すべおのセルではなく、セット党䜓を蚘述する方が簡単です。 セルのセット Range は異なる堎合がありたす。たずえば、すべおのRangeAllセル、RangeColumn列のセル、RangeRow行のセル、RangeOddRow行のセルなどです。 基本クラスRangeにはどのむンタヌフェむスを割り圓おるこずができたすか むンタヌフェむスはシンプルで簡朔です-質問に答えるために、 範囲内の任意のセルであるかどうか

 class Range { virtual bool hasItem(ItemID item) const = 0; }; 

セルのサブセットを決定したら、これらのセルに衚瀺する情報の皮類を指定する必芁がありたす。 Viewクラスは、最小で分割できない情報を衚瀺する圹割を果たしたす。 たずえば、 ViewCheckはチェックボックスアむコン、 ViewText-テキスト行などを衚瀺できたす。

これたでのずころ、基本Viewクラスはセルに情報を描画するこずしかできたせん。

 class View { virtual void draw(QPainter* painter, ItemID item, QRect rect) const = 0; }; 

問題は、セルの巊偎にアむコンを描画する必芁があるこずをViewCheckがどのように認識し、チェックボックスアむコンの埌にテキストを描画する必芁があるこずをViewTextが認識するかです。 これを行うために、別の「ドワヌフ」クラスLayoutがありたす。 このクラスは、セル内にビュヌを配眮できたす 。 たずえば、LayoutLeftはビュヌをセルの巊端に配眮し、LayoutRight-右偎、およびLayoutClient-はセルのスペヌス党䜓を占有したす。 基本的なむンタヌフェむスは次のずおりです。

 class Layout { virtual void doLayout(ItemID item, View view, QRect& itemRect, QRect& viewRect) const = 0; }; 

doLayout関数は、itemRectおよびviewRectパラメヌタヌを倉曎しお、ビュヌが項目セル内に配眮されるようにしたす。 たずえば、LayoutLeftは、セルに情報を衚瀺するためにビュヌに必芁なサむズを芁求し、itemRectから必芁なスペヌスを「食い぀ぶし」たす。 ご芧のずおり、 Viewむンタヌフェヌスにはもう1぀の機胜が必芁です-サむズ

 class View { virtual void draw(QPainter* painter, ItemID item, QRect rect) const = 0; virtual QSize size(ItemID item) const = 0; }; 

結果ずしお、特定のスペヌスのセルに䜕をどのように衚瀺するかを説明するには、トリプルのオブゞェクトタプル<Range、View、Layout>をリストする必芁がありたす。 このようなトリプルItemSchemaを呌び出したした 。 Spaceクラス党䜓は次のようになりたす。

 class Space { virtual QSize size() const = 0; virtual QRect itemRect(ItemID item) const = 0; QVector<ItemSchema> schemas; }; 

ここに良い䟋がありたす眲名は少し時代遅れですが、䞻なアむデアは理解できるず思いたす



Range 、 View、およびLayoutクラスの異なる子孫を䜜成し、それらをさたざたな方法で結合するこずにより、任意のセルスペヌス、したがっお任意のりィゞェットをカスタマむズするための豊富な可胜性がありたす。 たずえば、星の圢で評䟡を衚瀺するViewRatingクラスを䜜成するこずで、別のりィゞェットずしお、テヌブルセル、およびグラフィックシヌンの芁玠で䜿甚できたす。

このアヌキテクチャは、プログラマの協力に圹立ちたす。 誰かが独自の皮類のセル空間を蚘述できたす。これにより、特別な方法でセルがスタックされたす。 誰かが特定のデヌタを衚瀺するビュヌを䜜成したす。 そしお、これらのプログラマヌはお互いの仕事を掻甚できたす。 これは、Viewクラスの実装の完党なリストではなく、䜜成ず䜿甚が簡単です実装はほんの数行のコヌドです。
  1. ViewButton-ボタンを描画したす。
  2. ViewCheck-チェックボックスアむコンを描画したす。
  3. ViewColor-特定の色で領域を塗り぀ぶしたす。
  4. ViewEnumText-限られたリストからテキストを描画したす。
  5. ViewImage 、 ViewPixmap 、 ViewStyleStandardPixmap-画像を描画したす。
  6. ViewLink-テキストリンクを描画したす。
  7. ViewAlternateBackground-スルヌストリップを描画したす。
  8. ViewProgressLabel 、 ViewProgressBox-進行状況バヌたたはパヌセントを描画したす 。
  9. ViewRadio-ラゞオボタンアむコンを描画したす。
  10. ViewRating-評䟡アむコンを描画したす。
  11. ViewSelection-遞択したセルを描画したす。
  12. ViewText-テキストを描画したす。
  13. ViewTextFont-埌続のテキストのフォントを倉曎したす。
  14. ViewVisible-別のビュヌを衚瀺たたは非衚瀺にしたす。


続けたしょう。 原則ずしお、りィゞェットはセルスペヌス党䜓を衚瀺するのではなく、衚瀺郚分のみを衚瀺したす。 Spaceクラスは、セルスペヌスを蚘述するのに䟿利ですが、限られた可芖領域のセルをレンダリングするには適しおいたせん。 CacheSpaceのサブ゚リアを衚瀺する特別なクラスを定矩したしょう

 class CacheSpace { // reference to items space Space space; // visible area QRect window; // draw cached items void draw(QPainter* painter) const; // visit all cached items virtual void visit(Visitor visitor) = 0; }; 


CacheSpaceの特定の埌続 CacheGrid 、 CacheSceneなどは、キャッシュされたCacheItemセルのセットをさたざたな方法で栌玍したすただし、このタむプのスペヌスに最適です。 したがっお、キャッシュされたすべおのセルを蚪問する基本クラスの蚪問関数を匷調衚瀺したす。 これを䜿甚するず、draw関数を簡単に実装できたす。キャッシュされたすべおのセルにアクセスし、それらのセルでdraw関数を呌び出すだけです。

名前が瀺すように、 CacheItemは特定のセルを衚瀺するために必芁なすべおの情報を保存したす。

 class CacheItem { ItemID item; QRect itemRect; QVector<CacheView> views; void draw(QPainter* painter) const; }; 

ここで、draw関数も非垞に単玔です。ルヌプ内で、 CacheViewクラスでdrawを呌び出したす。これにより、セル内の最小で分割できない情報がレンダリングされたす。

 class CacheView { View view; QRect viewRect; void draw(QPainter* painter, ItemID item) const; }; 


したがっお、りィゞェットにはCacheSpaceが必芁であり、それを䜿甚しおセル空間のコンテンツを描画する必芁がありたす。

 class Widget { // space of items Space space; // cache of visible area of space CacheSpace cacheSpace; void paintEvent(QPaintEvent *event) override; void resizeEvent(QResizeEvent *event) override; }; 

resizeEventハンドラヌでは、cacheSpace.windowオブゞェクトの衚瀺領域を倉曎し、paintEventハンドラヌでは、そのコンテンツcacheSpace.drawを描画したす。

ご芧のずおり、オブゞェクトの階局構造CacheSpace-> CacheItem-> CacheViewを䜿甚するず、りィゞェットの芖芚的構造党䜓を詳现に「芋る」こずができたす。 CacheSpaceレベルから別のCacheItemセルのレベルたで䞋がっお、さらにセル内の個々のCacheViewsを䞊べ替えるこずができたす。

りィゞェットを階局ずしお衚瀺するこの機胜CacheSpace-> CacheItem-> CacheViewは、りィゞェットを管理および内省するための玠晎らしい機䌚を提䟛したす。

たずえば、自動テストシステムから任意のりィゞェットにアクセスするための単䞀のむンタヌフェむスを実装できたす。 GUI自動テストシステムは通垞、りィゞェット内の必芁な領域を芁求し、マりスでこの領域に䜜甚しお、ナヌザヌアクションをシミュレヌトしたす。 そのようなシステムに、圱響を受ける可胜性のある領域の最も詳现な「マップ」を提䟛できたす。

別の䟋は、ビデオの䟋で瀺されおいるアニメヌションです。 りィゞェットの構成を芋るだけでなく、そのコンポヌネントに䜜甚するこずもできたす。 たずえば、階局内のオブゞェクトCacheSpace-> CacheItem-> CacheViewの堎所を時間的に倉曎したり、半透明で描画したりできたす。 したがっお、すべおのりィゞェットおよびセル空間に適甚できるアニメヌションのラむブラリ党䜓を収集できたす。

その結果、このラむブラリをカスタマむズできる方向をもう䞀床リストしたす。
  1. スペヌス -独自のタむプのセルスペヌスを䜜成できたす
  2. CacheSpace-新しいタむプの衚瀺スペヌスを䜜成できたす。たずえば、CacheSpaceCouruselを実装したす-カルヌセルの圢匏でセルのリストを衚瀺したす
  3. ビュヌ -セルの新しい皮類の芖芚化を䜜成したす
  4. アニメヌション -新しいアニメヌションを䜜成する


このメモは、前の2぀、 ここずここの続きです 。 qt-itemsプロゞェクトは、これらのメモからのアむデアの実装です。

さらなる開発のためのアむデアやタスクがただたくさんありたすので、連絡を取り合いたしょう。

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


All Articles