ホームページ > バックエンド開発 > PHPチュートリアル > C++ を使用した QML の TreeView モデルの実装 (1)_PHP チュートリアル

C++ を使用した QML の TreeView モデルの実装 (1)_PHP チュートリアル

WBOY
リリース: 2016-07-12 08:54:16
オリジナル
1254 人が閲覧しました

C++ を使用して QML の TreeView モデルを実装する (1)

ListView、TableView、GridView などの QML のデータ アクセス コンポーネントは、通常、データ プロバイダーとして ListModel を使用します。このアプリケーションには、ローカル ファイルにアクセスできないなど、かなりの制限があります。システムは従来の SQL データベースに接続できないため、データ アクセスは通常 C++ を通じて行われ、データの表示と編集は QAbstractItemModel、QAbstractTableModel、QSQLTableModel などを介して実行されます。すべての高度なモデル コンポーネントは QAbstractItemModel から継承します。QAbstractItemModel のインターフェイス関数と操作メカニズムを理解していれば、QT のモデル/ビュー メカニズムの実装を理解できます。
QAbstractItemModel は抽象クラスです。QAbstractItemModel をインスタンス化するには、少なくとも次の 5 つのメソッドを継承して実装する必要があります:

int rowCount(const QModelIndex &parent=QModelIndex()) const;
int columnCount(const QModelIndex &parent=QModelIndex()) const;
QModelIndexindex(int row, int column, const QModelIndex &parent=QModelIndex()) const;
QVariant data(const QModelIndex &index, int role=Qt::DisplayRole) const;
QModelIndexparent(const QModelIndex &child) const;
with QWidget コンポーネントの違いは、QML データ モデルではデータ アクセスが列 (Column) を通じてではなく、ロールを通じて行われることです。たとえば、

<ol style="margin:0 1px 0 0px;padding-left:40px;" start="1" class="dp-css"><li>TableView{<br /> </li><li>id:tableView1<br /></li><li>anchors.fill: parent<br /></li><li>TableViewColumn{<br /></li><li>width:50<br /></li><li>title:""<br /></li><li>role:"tagging" </li><li>}<br /></li><li><br /></li><li>TableViewColumn{<br /></li><li>width:80<br /></li><li>title:"操作"<br /></li><li>role:"name" </li><li>} </li><li>} </li></ol>
ログイン後にコピー
TableViewColumn は TableView の列定義であり、TableViewColumn が定義されています。モデルからデータを取得するには、TableView はモデルの roleNames() メソッドを呼び出して、モデルで使用できるロールを取得します。したがって、実装する必要がある 5 つの仮想関数に加えて、どのロールが利用可能であるかをビューに伝えるために roleNames() も再実装する必要があります。 roleNames() のプロトタイプは次のとおりです。
以下は完全な Model クラス定義です:

<ol style="margin:0 1px 0 0px;padding-left:40px;" start="1" class="dp-css"><li>QHash<int,QByteArray> roleNames() const; </li></ol>
ログイン後にコピー
roleNames() の実装は非常に簡単です:



<ol style="margin:0 1px 0 0px;padding-left:40px;" start="1" class="dp-css"><li>classSqlMenuEntry:public QAbstractItemModel,public QQmlParserStatus<br /> </li><li>{<br /></li><li>Q_OBJECT<br /></li><li>public:<br /></li><li>explicit SqlMenuEntry(QObject *parent=0);<br /></li><li>~SqlMenuEntry();<br /></li><li>enum MenuEntryRoles{idRole=Qt::UserRole+1,nameRole,defaultEntryRole,customEntryRole,iconRole,iconHoverRole};<br /></li><li>int rowCount(const QModelIndex &parent=QModelIndex()) const;<br /></li><li>int columnCount(const QModelIndex &parent=QModelIndex()) const;<br /></li><li>QModelIndex index(int row, int column, const QModelIndex &parent=QModelIndex()) const;<br /></li><li>QVariant data(const QModelIndex &index, int role=Qt::DisplayRole) const;<br /></li><li>QModelIndex parent(const QModelIndex &child) const;<br /></li><li>QHash<int,QByteArray>roleNames() const;<br /></li><li>private:<br /></li><li>QHash<int,QByteArray> mRoleNames;<br /></li><li> QList<QHash<int,QVariant>> mRecords; //真正的数据保存在这里,QList只能保存二维数据没办法保存树状节点,这里仅仅是例子<br /></li><li>};<br /></li><li><br /></li><li></li></ol>
ログイン後にコピー
mRoleNames はクラス コンストラクターで初期化できます:


<ol style="margin:0 1px 0 0px;padding-left:40px;" start="1" class="dp-css"><li>QHash<int, QByteArray> SqlMenuEntry::roleNames() const<br /> </li><li>{<br /></li><li>return mRoleNames;<br /></li><li>} </li></ol>
ログイン後にコピー
は "name" を通じて QML に渡すことができます"、"menuid"、"icon" はデータにアクセスします:

<ol style="margin:0 1px 0 0px;padding-left:40px;" start="1" class="dp-css"><li>SqlMenuEntry::SqlMenuEntry(QObject *parent)<br /> </li><li>:QAbstractItemModel(parent)<br /></li><li>{<br /></li><li>mRoleNames[nameRole] = "name";<br /></li><li>mRoleNames[idRole] = "menuid";<br /></li><li>mRoleNames[iconRole] = "icon";<br /></li><li>mRoleNames[defaultEntryRole] = "default";<br /></li><li>mRoleNames[iconHoverRole] = "iconHover";<br /></li><li>} </li></ol>
ログイン後にコピー
2 次元テーブルのデータのみを提供する場合は、上記のインターフェイス関数の名前に基づいて View ビューへのデータ供給を実装するだけで済みます。 :


<ol style="margin:0 1px 0 0px;padding-left:40px;" start="1" class="dp-css"><li>ListView{<br /> </li><li>model:MenuEntryModel{ }<br /></li><li>delegate:Item{<br /></li><li>Column{<br /></li><li>Text{text:name}<br /></li><li> Text{text:icon}<br /></li><li>}<br /></li><li>}<br /></li><li>} </li></ol>
ログイン後にコピー


mRecords 内のデータは、追加データを取得するために QSqlQuery コンポーネントを介してデータベース サーバーから取得するなど、オンデマンドで生成できます:

<ol style="margin:0 1px 0 0px;padding-left:40px;" start="1" class="dp-css"><li>int SqlMenuEntry::rowCount(const QModelIndex &parent) const<br /> </li><li>{<br /></li><li> return mRecords.size();</li><li><br /></li><li>} </li><li>int SqlMenuEntry::columnCount(const QModelIndex &parent) const </li><li>{ </li><li> return 1;  //QML不使用列获取数据,默认返回一列,不返回1例的话,View控件会认为表是空表,不获取数据 </li><li>} </li><li>QModelIndex SqlMenuEntry::index(int row, int column, const QModelIndex &parent) const </li><li>{ </li><li>  if((row >= 0)&&(row < mRecords.size())) </li><li>  { </li><li>    return createIndex(row,column); </li><li>  } </li><li>  return QModelIndex();  //返回一个无效的空索引 </li><li>} </li><li>QModelIndex SqlMenuEntry::parent(const QModelIndex &child) const </li><li>{ </li><li>  return QModelIndex(); //二维表中的行没有parent节点 </li><li>} </li><li>QVariant SqlMenuEntry::data(const QModelIndex &index, int role) const </li><li>{ </li><li>  if(index.isValid) </li><li>  { </li><li>   return mRecords[index.row()][role]; </li><li>  } </li><li>} </li></ol>
ログイン後にコピー
実装後のモデル クラスは、



<ol style="margin:0 1px 0 0px;padding-left:40px;" start="1" class="dp-css"><li> QHash<int,QVariant> row;<br /> </li><li>row[nameRole] = "name1";<br /></li><li>row[iconRole] = "icon1";<br /></li><li>mRecords.append(row); </li></ol>
ログイン後にコピー
、登録されたクラスは QML Generate インスタンスに含めることができます:


<ol style="margin:0 1px 0 0px;padding-left:40px;" start="1" class="dp-css"><li>qmlRegisterType<SqlMenuEntry>("com.limutech.tv",1,0,"MenuEntryModel");</li></ol>
ログイン後にコピー
View コンポーネント データを取得するプロセスはおおよそ次のとおりです:
1. View は rowCount(constQModelIndex &parent) を呼び出し、空の親を取得に渡します。ルート ノードの行数

2. ビューは、columnCount(const QModelIndex &parent) を呼び出し、ルート ノードの列数を取得するために空の親を渡します

3. ビューは、各行と列を列挙し、index(int) を呼び出します。 row, int column, const QModelIndex &parent) を使用して、行番号、列番号、および空の親を渡してルート ノード QModelIndex を取得します ;
4. 返された modelIndex を親として引き続き使用して、各行の rowCount と columnCount を取得します。 0 より大きい場合、ノードには子ノードがあります。
5. roleNames を呼び出して、使用可能なロールのリストを返します。

6. 返された modelIndex と role をパラメーターとして使用し、data を呼び出してデータを取得し、対応するデリゲートを使用してそれを表示します。したがって、ツリー リストを表示するには、親が空でない場合に対処できるように 2 次元テーブル モデルを改良する必要があります。同時に、このセクションでは次のようにモデルがツリー データを保存できるようにする必要があります。引き続き、階層モデルの実装とデータ変更を伴う実装について共有していきます。













http://www.bkjia.com/PHPjc/1120299.html

www.bkjia.com

本当

http://www.bkjia.com/PHPjc/1120299.html

C++ を使用した QML の TreeView モデルの実装 (1) ListView、TableView、GridView などの QML のデータ アクセス コンポーネントは通常、データ プロバイダーとして ListModel を使用します。このアプリケーションにはかなりの制限があります...
関連ラベル:
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート