QStandardItemModelのモデル - ビュー - デリゲートのQTコンセプト--- 1

クラスQabstractItemModel、QabstractListModelは、QAbstractTableModelデータは、これらのクラスをサブクラス化するユーザーのニーズを保存し、ストアデータのサブクラスに特定のデータ構造を定義していません。

対照的に、データを保存する責任クラスQStandardItemModelは、各データ項目は、オブジェクトQStandardItemクラスとして表されます。次に、我々はクラスQStandardItemModeの内容の二つの側面から主に紹介します。

  1. ファーストクラスQStandardItemの保存は、データ項目を使用する方法について説明します
  2. そして、これらのデータ項目を整理するために、クラスのQStandardItemModelを使用する方法について説明し、リストが形成され、または他の表示のための木のテーブル、ビュークラスです。

第一の局面ではまず見て:

前に述べたように、データ項目には、いくつかの「役割、データの子」のペアで構成されています。保全を担当するクラスQStandardItem、これらのデータへのアクセス。内部クラスは、型QVectorコンテナを定義します

基本的に、コンテナ「文字データの子」右の各記憶素子。サブ項目に対応する文字データは異なるタイプを有することができるので、QtのQVariantは、各データサブアイテムを格納するために使用されます。

ユーザーがQStandardItemオブジェクトにいくつかのデータを保存したいときは、そのメンバ関数を呼び出すことができます。

//預金の "役割、値"(QVariant&値、int型の役割のconst)無効にsetData。

ユーザーがデータオブジェクトを読みたい場合は、他のメンバ関数を呼び出すことができます。

QVariantデータ(int型の役割=)constは//子の役割に対応する文字データを読み込みます。

これらの2つの機能は、QStandardItemの中核です。この2つの機能により、我々は、右のいずれかのデータ項目「の役割、データの子」によって表されるクラスにアクセスすることができます。しかし、いくつかの一般的に使用される文字のために、

このクラスは、メンバ関数を覚えやすい、より簡潔に、用意されています。例えば、データ項目が表示されたとき、多くの場合、いくつかのテキスト、アイコンが含まれているビューも、チェックボックスが含まれていてもよいとき。

共通の役割:

  • Qtの:: BackgroundRoleは、ディスプレイの背景を制御します
  • Qtの:: FontRoleコントロールテキストフォント、
  • Qtの:: ForegroundRoleコントロールのテキストの色、
  • チェックボックスのQtの:: CheckStateRole制御状態。

このクラスは、メンバー関数のセットを提供し、容易にロールに対応するこれらの一般的に使用されるデータサブ項目にアクセスすることができます。

  • メンバー関数setBackground()、バックグラウンドは、()/バック背景ブラシを提供しています。
  • 機能のsetFont()、フォントは()セット/リターン・テキストのフォントです。
  • 機能setForeground()、フォアグラウンドは、()/バックフォントの色を提供しています。
  • 機能setCheckState()、にcheckState()/バックチェックボックスを提供しています。

そして、第二の側面を見てみましょう。

QStandardItemデータ項目は、リスト、テーブル、木や、より複雑なデータ構造を形成するための代表クラスQStandardItemModelクラス編成。

  • このクラスは、データエントリが変更されている、これらのデータ構造に新しいアイテムを追加し、メンバ関数のセットを提供し、または既存のデータ項目を削除します。
  • 一方、モデルクラスとその実装インタフェース定義QAbstractItemModel機能、他のクラスは、データ項目ビューモデルにアクセスできるようになります。

1:データ・セットがリストとして表現されている場合、我々は、()のアイテムを使用し、リストにデータ項目を追加するためのクラスメンバ関数appendRow QStandardItemModel()を呼び出してデータ項目を読み出すことができます。

コードセグメント13-10に示すように。

  • ルートノードの①取得モデル最上行
  • ライン②データ項目を表しQStandardItemオブジェクトを作成し、
  • ③申込は、ルートノードの子ノードとしてリストに追加しました。

②クラスコンストラクタコールのsetData内側の列()関数、新たに構築されたDisplayRole対応するデータサブ項目にオブジェクトとしてのQt :: QStringのオブジェクトの線②。

データセットがリスト自体であるので、QListViewは、このデータセットを表示するので、私たちが使用する、読者はこの例ビューの結果を実行することができます。

スニペット13-10:使用QStandardItemModel処理リスト

コードをコピー

    QStandardItemModelのListModel。
    QStandardItem * rootItem = listModel.invisibleRootItem(); //行1 
    {(;行<4 ++行int型の列= 0)ため

        QStandardItem *アイテム=新しいQStandardItem(QStringの( "%1")のarg(行)。)。//行2 
        rootItem-> appendRow(項目); //行3 
    } 
    QListViewリストビュー。
    listView.setModel(&するListModel)。

コードをコピー

2:データセットは表として表される場合、そのようなコードセグメント13-11として、テーブル内のデータ項目を設定する)(SetItem関数QStandardItemModelクラスのメンバ関数を呼び出すことができます。

このデータ・セットのコード・セグメント・テーブルであるため、データの使用はQTableView表示を設定します。

スニペット13-11:使用QStandardItemModel処理フォーム

コードをコピー

    QStandardItemModelするTableModel(4、4); 
    (;行<4; int型の列= 0 ++行)のために{ 
        (INTカラム= 0;カラム<4; ++カラム)用{ 
            QStandardItem *アイテム=新しいQStandardItem(QStringの( "%0、%1")。引数(行).arg(カラム))。
            tableModel.setItem(行、列、項目)。
       } 
    } 
    QTableViewのtableView。
    tableView.setModel(&のTableModel)。

コードをコピー

 

3:データセットがツリーとして表現されている場合は、ツリーノードに子ノードを追加するには、クラスのメンバ関数()のappendRow QStandardItemModelを呼び出すことができます。

繰り返し関数を呼び出すことによって、あなたは複雑なツリーを構築することができます。トップレベルのルートテキストは「0」の子ノードであり、単純なツリー13-12を構築するコードセグメント

子ノードは、「1」の子ノードにテキストを持っています。ように、「1」の子ノードが「2」の子ノード「2」は、子ノード「3」の子ノードを有している4のツリー深さを形成することを有しています。

ツリーない兄弟ノードの各ノードは、(同じ親を有する複数のノードが互いに兄弟と呼ばれる)、興味のある読者は、いくつかの兄弟ノードを持っているように、コードを変更することができます。

データセットが木なので、我々はそれを表示するQTreeViewを使用しています。

処理QStandardItemModelツリーを使用してコードセグメント13-12:

コードをコピー

QStandardItemModelのTreeModel; 
QStandardItem * parentItem = treeModel.invisibleRootItem(); 
以下のために(INT iが= 0; I <4; ++ I){ 
  QStandardItem *アイテム=新しいQStandardItem(QStringの( "%0")のarg(I))。
  parentItem-> appendRow(項目); 
  parentItem =項目。
} 
QTreeViewツリービュー。
treeView.setModel(&TreeModelの);

コードをコピー

私はクラスQStandardItemModelリスト、テーブル、木や、より複雑なデータ構造を表現することができた、その内部QStandardItemクラスのおかげでのタイプを定義します

QVector <QStandardItem *>コンテナ、オブジェクトのQStandardItem各コンテナ要素は、子オブジェクトとして設定してもよいと呼ば。図13-13に示すクラス図では、パフォーマンス、および自身がQStandardItemクラス「子供」の関係を持っています。自己会合は、クラスを発生すると、UMLにおける自己相関(自己会合)と呼ばれています。QStandardItemModel部材は、オブジェクトへのポインタQStandardItem論理ルートデータと呼ばれるクラスを定義します。このオブジェクトは、他の子オブジェクトおよびサブオブジェクトを含めることができ、それぞれが、そのサブオブジェクトとして複数QStandardItemを標的とするように設定することができます。ように、ツリーは任意の深さを有していてもよく、それぞれの親オブジェクトは、サブオブジェクトの任意の数を含めることができます。

 

 

当然のことながら、使用さQStandardItemModel QStandardItemは13-14、データセットのツリーデータ構造を表します。

图中的每个小方框表示类QStandardItem的一个对象。如果小方框的边线为虚,相应的QStandardItem对象并不表示数据集中的任何数据,仅被用来表示某种数据结构。如果小方框的边线为实,相应的QStandardItem对象就表示数据集中的一个数据项。在右侧的图中,QStandardItemModel的数据成员root所指的对象表示一个不可见的根,而数据集的根(图中结点G)被表示为这个不可见根的一个子节点。

 

 

列表被看作一个特殊的树:不可见根具有若干个子节点,每个子节点表示列表中的一个数据项,不再包含任何子节点,如该图左侧所示。

而表格的表示方式反而麻烦一些。不可见根含有若干子节点(图中A,B,C),这些子节点并不表示数据集中的任何数据项。

第i个子节点会包含若干子节点(比如图中D,E,F),这些子节点才表示表格第i行的数据项。

最后再讨论一下QStandardItemModel表示数据集的优缺点:

使用QStandardItemModel表示数据集具有以下优点:

  1. 该类使用QStandardItem存放数据项,用户不必定义任何数据结构来存放数据项;
  2. QStandardItem使用自关联关系,能够表达列表、表格、树甚至更复杂的数据结构,能够涵盖各种各样的数据集;
  3. QStandardItem本身存放着多个『角色,数据子项』,视图类、委托类或者其他用户定义的类能够方便地依据角色访问各个数据子项。

然而,这种表示方法也有局限性:

  • 当数据集中的数据项很多时,施加在数据集上的某些操作的执行效率会很低。

      比如,设数据集是一个1万行、20列的表格,其中第10列存放的是浮点数。如果我们想计算这一列的平均值,按照图13-14,这需要遍历所有行,

取得第10列的QStandardItem对象,再依据角色“Qt::DisplayRole”取得对应的数据子项。由于这个数据子项的类型为QString,还需要将其转换为浮点数,

最后求所有浮点数的平均值。这些操作会耗费较长的时间。

そのため、データの量が非常に高く、非常に大きなではないではない時の性能要件、我々は、データの集合を表すためにクラスQStandardItemModelを使用することができます。

データセットにそうでない場合、ユーザーはQAbstractItemModel、QAbstractListModelまたはQAbstractTableModelから新しいクラスを派生する必要があり、自己管理ストレージとアクセス

公開された34元の記事 ウォンの賞賛4 ビュー20000 +

おすすめ

転載: blog.csdn.net/u014725884/article/details/104269399