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

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

Jul 12, 2016 am 08:54 AM
android

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

上で2次元テーブルモデルの実装を紹介しましたが、次に階層モデルの実装を共有します。まず、ノードデータを保存するノードクラスを実装します。ツリー データ モデルとノードの関係:

<ol style="margin:0 1px 0 0px;padding-left:40px;" start="1" class="dp-css"><li>class TreeNode;<br /> </li><li><br /></li><li>typedef TreeNode* TreeNodePtr;<br /></li><li><br /></li><li>class TreeNode<br /></li><li>{<br /></li><li>public:<br /></li><li>explicit TreeNode();<br /></li><li>TreeNodePtr parent() const;<br /></li><li>void setParent(const TreeNodePtr p); //设置父节点,根节点的父节点为NULL<br /></li><li>void appendNode(TreeNodePtr node);<br /></li><li>void removeNode(int row);<br /></li><li>void setData(int role,QVariant value);  </li><li>QList<TreeNodePtr>childs;  //用于保存子节点指针,把childs放到public不好,仅仅是为了方便,不要学。<br /></li><li><br /></li><li>private:<br /></li><li>TreeNodePtr mParent=NULL;  //父节点<br /></li><li>QHash<int,QVariant>mRecord; //一个节点可以保存一行数据,哈希表的key是整型,用于保存role,QVariant保存数据<br /></li><li><br /></li><li>}; </li></ol>
ログイン後にコピー
TreeNode の実装も非常に簡単です:

<ol style="margin:0 1px 0 0px;padding-left:40px;" start="1" class="dp-css"><li>TreeNodePtr TreeNode::parent() const<br /> </li><li>{<br /></li><li>return mParent;<br /></li><li>}<br /></li><li><br /></li><li>void TreeNode::setParent(const TreeNodePtr p)<br /></li><li>{<br /></li><li>this->mParent = p;<br /></li><li>}<br /></li><li><br /></li><li>void TreeNode::appendNode(TreeNodePtr node)<br /></li><li>{<br /></li><li>childs.append(node);<br /></li><li>}<br /></li><li><br /></li><li>void TreeNode::removeNode(int row)<br /></li><li>{<br /></li><li>childs.removeAt(row);<br /></li><li>}<br /></li><li><br /></li><li><br /></li><li>QVariant TreeNode::data(int role)<br /></li><li>{<br /></li><li>return mRecord[role];<br /></li><li>}<br /></li><li><br /></li><li>void TreeNode::setData(int role, QVariant value)<br /></li><li>{<br /></li><li>mRecord[role] = value;<br /></li><li>} </li></ol>
ログイン後にコピー
は次に SqlMenuEntryModel で操作を開始します:

<ol style="margin:0 1px 0 0px;padding-left:40px;" start="1" class="dp-css"><li>class SqlMenuEntry: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>  <s>QList</s><s><</s><s>QHash</s><s><</s><s>int</s><s>,</s><s>QVariant</s><s>></s><s>></s><s> mRecords</s><s>;</s> //QList不能保存树状数据,干掉<br /></li><li>  QList mRootEntrys;   //用于保存根节点 </li><li>  void _addEntryNode(TreeNodePtr node,TreeNodePtr parent=0); //用于向树添加节点 </li><li>}; </li></ol>
ログイン後にコピー
_addEntryNode は次のように実装されます:

<ol style="margin:0 1px 0 0px;padding-left:40px;" start="1" class="dp-css"><li>void SqlMenuEntry::_addEntryNode(TreeNodePtr node, TreeNodePtr parent)<br /> </li><li>{<br /></li><li>if(parent == NULL)<br /></li><li>{<br /></li><li>mRootEntrys.append(node);<br /></li><li>}else{<br /></li><li>node->setParent(parent);<br /></li><li>parent->appendNode(node);<br /></li><li>}<br /></li><li>} </li><li><br /> </li></ol>
ログイン後にコピー
は次のコードを通じてモデルにデータを追加できます:


<ol style="margin:0 1px 0 0px;padding-left:40px;" start="1" class="dp-css"><li>beginResetModel();<br /> </li><li><br /></li><li>auto node = new TreeNode(); </li><li>node->setData(nameRole,"parent 1");<br /></li><li>node->setData(iconRole,"parenticon1"); </li><li>_addEntryNode(node);  //添加第一个根节点<br /></li><li>    </li><li>     auto subNode = new TreeNode(); </li><li>     subNode->setData(nameRole,"child1");<br /></li><li>     _addEntryNode(subNode,node); //添加子节点 </li><li><br /> </li><li>endResetModel(); </li></ol>
ログイン後にコピー
上記のコードは、ルート ノードparent1 とparent1 の子ノードchild1 を追加します。次に、TreeView が正しいデータとデータの関係をスムーズに表示できるように、SqlMenuEntryModel を継続的に改善できます。まず、モデルがルート ノードの数と子ノードの行数を正しく返すことができるように、 int rowCount(const QModelIndex &parent) を変更します。

<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>if(parent.isValid()) //parent不为空,则要获取的行数是某个节点的子节点行数<br /></li><li>{<br /></li><li>TreeNodePtr parentNode = (TreeNodePtr)parent.internalPointer(); //节点信息在index时被保存在QModelIndex的internalPointer中<br /></li><li>return parentNode->childs.size();<br /></li><li>} </li><li>return mRootEntrys.size(); //否则返回的是根节点行数<br /></li><li><br /></li><li>} </li></ol>
ログイン後にコピー


モデルが子ノードを取得し、対応するノード ポインターを保存します。modelIndex の externalPointer 内:

<ol style="margin:0 1px 0 0px;padding-left:40px;" start="1" class="dp-css"><li>QModelIndex SqlMenuEntry::index(int row, int column, const QModelIndex &parent) const<br /> </li><li>{<br /></li><li>if(!parent.isValid()) //parent为空,返回的是根节点的modelIndex,返回的同时,把节点数据指针(TreeNodePtr)保存在QModelIndex的internalPointer中,以便在其它函数中获取节点数据<br /></li><li>{<br /></li><li>if((row >= 0) && (row < mRootEntrys.size()))<br /></li><li>{<br /></li><li>return createIndex(row,column,mRootEntrys.at(row)); <br /></li><li>}<br /></li><li>}else{<br /></li><li>TreeNodePtr parentNode = (TreeNodePtr)parent.internalPointer(); //返回子节点的modelIndex<br /></li><li>return createIndex(row,column,parentNode->childs[row]);<br /></li><li>}<br /></li><li>return QModelIndex();<br /></li><li>} </li></ol>
ログイン後にコピー
parent(const QModelIndex &child) は、ノードの親ノード インデックスを返すために使用されます。

<ol style="margin:0 1px 0 0px;padding-left:40px;" start="1" class="dp-css"><li>QModelIndex SqlMenuEntry::parent(const QModelIndex &child) const<br /> </li><li>{<br /></li><li>TreeNodePtr node = (TreeNodePtr)child.internalPointer();<br /></li><li>if(node->parent() == NULL)<br /></li><li>{<br /></li><li>return QModelIndex(); //根节点没有parent<br /></li><li>}else{<br /></li><li>return createIndex(0,1,node->parent());<br /></li><li>} </li></ol>
ログイン後にコピー
は、data(constQModelIndex&index,introle) を実装してデータを返します。ノード:
<ol style="margin:0 1px 0 0px;padding-left:40px;" start="1" class="dp-css"><li>QVariant SqlMenuEntry::data(const QModelIndex &index, int role) const<br /> </li><li>{<br /></li><li>TreeNodePtr node = (TreeNodePtr)index.internalPointer();<br /></li><li>return node->data(role);<br /></li><li>} </li></ol>
ログイン後にコピー

上記の作成後、モデルの準備が整います。 通常どおりデータを TreeView に提供します:

<ol style="margin:0 1px 0 0px;padding-left:40px;" start="1" class="dp-css"><li>TreeView{<br /> </li><li>anchors.fill: parent<br /></li><li>TableViewColumn {<br /></li><li>title: "Name"<br /></li><li>role: "name"<br /></li><li>}<br /></li><li><br /></li><li>TableViewColumn {<br /></li><li>title: "Entry"<br /></li><li>role: "icon"<br /></li><li>}<br /></li><li>model:MenuEntryModel{}<br /></li><li>} </li></ol>
ログイン後にコピー
は引き続き動作し、明日もデータの追加、削除、更新に関連するエクスペリエンスを追加し続けます。







www.bkjia.com本当http://www.bkjia.com/PHPjc/1120298.html技術記事 C++ を使用した QML の TreeView モデルの実装 (2) 上記では 2 次元テーブル モデルの実装を紹介しましたが、次に階層モデルの実装を共有します。まず、ツリー データを保存するノード クラスを実装します...
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

AI Hentai Generator

AI Hentai Generator

AIヘンタイを無料で生成します。

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

中国語版、とても使いやすい

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

新しいレポートは、噂のSamsung Galaxy S25、Galaxy S25 Plus、Galaxy S25 Ultraのカメラアップグレードのひどい評価を提供します 新しいレポートは、噂のSamsung Galaxy S25、Galaxy S25 Plus、Galaxy S25 Ultraのカメラアップグレードのひどい評価を提供します Sep 12, 2024 pm 12:23 PM

ここ数日、Ice Universeは、サムスンの次期主力スマートフォンであると広く信じられているGalaxy S25 Ultraの詳細を着実に明らかにしている。とりわけ、リーカーはサムスンがカメラのアップグレードを1つだけ計画していると主張した

Samsung Galaxy S25 Ultraの最初のレンダリング画像がリークされ、噂のデザイン変更が明らかに Samsung Galaxy S25 Ultraの最初のレンダリング画像がリークされ、噂のデザイン変更が明らかに Sep 11, 2024 am 06:37 AM

OnLeaks は、X (旧 Twitter) のフォロワーから 4,000 ドル以上を集めようとして失敗した数日後、Android Headlines と提携して Galaxy S25 Ultra のファーストルックを提供しました。コンテキストとして、h の下に埋め込まれたレンダリング イメージ

IFA 2024 | TCLのNXTPAPER 14は、パフォーマンスではGalaxy Tab S10 Ultraに匹敵しませんが、サイズではほぼ匹敵します IFA 2024 | TCLのNXTPAPER 14は、パフォーマンスではGalaxy Tab S10 Ultraに匹敵しませんが、サイズではほぼ匹敵します Sep 07, 2024 am 06:35 AM

TCLは、2つの新しいスマートフォンの発表に加えて、NXTPAPER 14と呼ばれる新しいAndroidタブレットも発表しました。その巨大な画面サイズはセールスポイントの1つです。 NXTPAPER 14 は、TCL の代表的なブランドであるマット LCD パネルのバージョン 3.0 を搭載しています。

Vivo Y300 Pro は、7.69 mm のスリムなボディに 6,500 mAh のバッテリーを搭載 Vivo Y300 Pro は、7.69 mm のスリムなボディに 6,500 mAh のバッテリーを搭載 Sep 07, 2024 am 06:39 AM

Vivo Y300 Pro は完全に公開されたばかりで、大容量バッテリーを備えた最もスリムなミッドレンジ Android スマートフォンの 1 つです。正確に言うと、このスマートフォンの厚さはわずか 7.69 mm ですが、6,500 mAh のバッテリーを搭載しています。これは最近発売されたものと同じ容量です

新しいレポートは、噂のSamsung Galaxy S25、Galaxy S25 Plus、Galaxy S25 Ultraのカメラアップグレードのひどい評価を提供します 新しいレポートは、噂のSamsung Galaxy S25、Galaxy S25 Plus、Galaxy S25 Ultraのカメラアップグレードのひどい評価を提供します Sep 12, 2024 pm 12:22 PM

ここ数日、Ice Universeは、サムスンの次期主力スマートフォンであると広く信じられているGalaxy S25 Ultraの詳細を着実に明らかにしている。とりわけ、リーカーはサムスンがカメラのアップグレードを1つだけ計画していると主張した

Samsung Galaxy S24 FEは、4色と2つのメモリオプションで予想よりも低価格で発売されると請求されています Samsung Galaxy S24 FEは、4色と2つのメモリオプションで予想よりも低価格で発売されると請求されています Sep 12, 2024 pm 09:21 PM

サムスンは、ファンエディション(FE)スマートフォンシリーズをいつアップデートするかについて、まだ何のヒントも提供していない。現時点では、Galaxy S23 FE は 2023 年 10 月初めに発表された同社の最新版のままです。

Motorola Razr 50s は初期リークで新たな予算を折り畳める可能性があることを示す Motorola Razr 50s は初期リークで新たな予算を折り畳める可能性があることを示す Sep 07, 2024 am 09:35 AM

Motorola は今年数え切れないほどのデバイスをリリースしましたが、そのうち折りたたみ式デバイスは 2 つだけです。ちなみに、世界の大部分ではこのペアが Razr 50 および Razr 50 Ultra として受け入れられていますが、Motorola は北米では Razr 2024 および Razr 2 として提供しています。

Xiaomi Redmi Note 14 Pro Plusは、Light Hunter 800カメラを搭載した初のQualcomm Snapdragon 7s Gen 3スマートフォンとして登場します Xiaomi Redmi Note 14 Pro Plusは、Light Hunter 800カメラを搭載した初のQualcomm Snapdragon 7s Gen 3スマートフォンとして登場します Sep 27, 2024 am 06:23 AM

Redmi Note 14 Pro Plusは、昨年のRedmi Note 13 Pro Plus(Amazonで現在375ドル)の直接の後継者として正式に発表されました。予想通り、Redmi Note 14 Pro Plusは、Redmi Note 14およびRedmi Note 14 Proと並んでRedmi Note 14シリーズをリードします。李

See all articles