Qt快捷方式编辑器示例

快捷方式编辑器示例展示了如何创建一个基本的读写分层模型,以与Qt的标准视图和类一起使用。有关模型/视图编程的说明,请参阅概述。

Qt的模型/视图架构为视图提供了一种标准的方式来操作数据源中的信息,使用数据的抽象模型来简化和标准化数据的访问方式。快捷方式编辑器模型将操作表示为项目树,并允许视图通过系统访问此数据。更一般地说,模型可用于以树结构的形式表示数据,方法是允许每个项充当子项表的父项。

设计与概念

我们用来表示数据结构的数据结构采用从ShortcutEditorModelItem对象构建的树的形式。每个 ShortcutEditorModelItem 表示树视图中的一个项,并包含两列数据。

快捷方式编辑器结构

数据使用在基于指针的树结构中链接在一起的 ShortcutEditorModelItem 对象在模型内部存储。通常,每个 ShortcutEditorModelItem 都有一个父项,并且可以有多个子项。但是,树结构中的根项没有父项,并且永远不会在模型外部引用它。

每个 ShortcutEditorModelItem 都包含有关其在树结构中的位置的信息;它可以返回其父项及其行号。随时提供此信息可以更轻松地实现模型。

由于树视图中的每个项通常包含几列数据(在本例中为名称和快捷方式),因此很自然地将此信息存储在每个项目中。为简单起见,我们将使用对象列表来存储项目中每一列的数据。

使用基于指针的树结构意味着,当将模型索引传递给视图时,我们可以在索引中记录相应项的地址(参见 ()),并在以后使用 () 检索它。这使得编写模型更容易,并确保引用同一项的所有模型索引都具有相同的内部数据指针。

有了适当的数据结构,我们可以创建一个树模型,其中包含最少的额外代码,以向其他组件提供模型索引和数据。

快捷方式编辑器模型项类定义

类定义如下:

该类是基础C++类。它不继承或提供信号和插槽。它用于保存 QVariants 列表,其中包含列数据以及有关其在树结构中的位置的信息。这些函数提供以下功能:

  • 用于在首次构建模型时添加数据,在正常使用期间不使用。appendChildItem()
  • 和函数允许模型获取有关任何子项的信息。child()childCount()
  • 有关与项目关联的列数的信息由 提供,并且可以使用 data() 函数获取每列中的数据。columnCount()
  • 和函数用于获取项的行号和父项。row()parent()

父项和列数据存储在私有成员变量中。该变量包含指向项自己的子项的指针列表。parentItemitemDatachildItems

快捷方式编辑器模型类定义

该类定义如下:ShortcutEditorModel

<span style="color:#404244"><span style="background-color:#3a4055"><span style="color:#ffffff"><span style="color:#ffff55">class</span> <span style="color:#4f9d08">ShortcutEditorModel</span> <span style="color:#ffffff">:</span> <span style="color:#ffff55">public</span> <a data-cke-saved-href="https://doc.qt.io/qt-6/qabstractitemmodel.html" href="https://doc.qt.io/qt-6/qabstractitemmodel.html"><span style="color:#21be2b">QAbstractItemModel</span></a>
<span style="color:#ffffff">{</span><span style="color:#ffffff">
    Q_OBJECT

    </span><span style="color:#ffff55">class</span> <span style="color:#4f9d08">ShortcutEditorModelItem</span>
    <span style="color:#ffffff">{</span>
    <span style="color:#ffff55">public</span><span style="color:#ffffff">:</span>
        <span style="color:#ffff55">explicit</span> <span style="color:#4f9d08">ShortcutEditorModelItem</span><span style="color:#ffffff">(</span><span style="color:#ffff55">const</span> <a data-cke-saved-href="https://doc.qt.io/qt-6/qlist.html" href="https://doc.qt.io/qt-6/qlist.html"><span style="color:#21be2b">QList</span></a><span style="color:#ffffff"><</span><a data-cke-saved-href="https://doc.qt.io/qt-6/qvariant.html" href="https://doc.qt.io/qt-6/qvariant.html"><span style="color:#21be2b">QVariant</span></a><span style="color:#ffffff">></span> <span style="color:#ffffff">&</span><span style="color:#ffffff">data</span><span style="color:#ffffff">,</span>
                                         <span style="color:#4f9d08">ShortcutEditorModelItem</span> <span style="color:#ffffff">*</span><span style="color:#ffffff">parentItem </span><span style="color:#ffffff">=</span> <span style="color:#ffff55">nullptr</span><span style="color:#ffffff">);</span>
        <span style="color:#ffffff">~</span><span style="color:#4f9d08">ShortcutEditorModelItem</span><span style="color:#ffffff">();</span>

        <span style="color:#ffff55">void</span><span style="color:#ffffff"> appendChild</span><span style="color:#ffffff">(</span><span style="color:#4f9d08">ShortcutEditorModelItem</span> <span style="color:#ffffff">*</span><span style="color:#ffffff">child</span><span style="color:#ffffff">);</span>

        <span style="color:#4f9d08">ShortcutEditorModelItem</span> <span style="color:#ffffff">*</span><span style="color:#ffffff">child</span><span style="color:#ffffff">(</span><span style="color:#ffff55">int</span><span style="color:#ffffff"> row</span><span style="color:#ffffff">)</span> <span style="color:#ffff55">const</span><span style="color:#ffffff">;</span>
        <span style="color:#ffff55">int</span><span style="color:#ffffff"> childCount</span><span style="color:#ffffff">()</span> <span style="color:#ffff55">const</span><span style="color:#ffffff">;</span>
        <span style="color:#ffff55">int</span><span style="color:#ffffff"> columnCount</span><span style="color:#ffffff">()</span> <span style="color:#ffff55">const</span><span style="color:#ffffff">;</span>
        <a data-cke-saved-href="https://doc.qt.io/qt-6/qvariant.html" href="https://doc.qt.io/qt-6/qvariant.html"><span style="color:#21be2b">QVariant</span></a><span style="color:#ffffff"> data</span><span style="color:#ffffff">(</span><span style="color:#ffff55">int</span><span style="color:#ffffff"> column</span><span style="color:#ffffff">)</span> <span style="color:#ffff55">const</span><span style="color:#ffffff">;</span>
        <span style="color:#ffff55">int</span><span style="color:#ffffff"> row</span><span style="color:#ffffff">()</span> <span style="color:#ffff55">const</span><span style="color:#ffffff">;</span>
        <span style="color:#4f9d08">ShortcutEditorModelItem</span> <span style="color:#ffffff">*</span><span style="color:#ffffff">parentItem</span><span style="color:#ffffff">()</span> <span style="color:#ffff55">const</span><span style="color:#ffffff">;</span>
        <a data-cke-saved-href="https://doc.qt.io/qt-6/qaction.html" href="https://doc.qt.io/qt-6/qaction.html"><span style="color:#21be2b">QAction</span></a> <span style="color:#ffffff">*</span><span style="color:#ffffff">action</span><span style="color:#ffffff">()</span> <span style="color:#ffff55">const</span><span style="color:#ffffff">;</span>

    <span style="color:#ffff55">private</span><span style="color:#ffffff">:</span>
        <a data-cke-saved-href="https://doc.qt.io/qt-6/qlist.html" href="https://doc.qt.io/qt-6/qlist.html"><span style="color:#21be2b">QList</span></a><span style="color:#ffffff"><</span><span style="color:#4f9d08">ShortcutEditorModelItem</span> <span style="color:#ffffff">*</span><span style="color:#ffffff">></span><span style="color:#ffffff"> m_childItems</span><span style="color:#ffffff">;</span>
        <a data-cke-saved-href="https://doc.qt.io/qt-6/qlist.html" href="https://doc.qt.io/qt-6/qlist.html"><span style="color:#21be2b">QList</span></a><span style="color:#ffffff"><</span><a data-cke-saved-href="https://doc.qt.io/qt-6/qvariant.html" href="https://doc.qt.io/qt-6/qvariant.html"><span style="color:#21be2b">QVariant</span></a><span style="color:#ffffff">></span><span style="color:#ffffff"> m_itemData</span><span style="color:#ffffff">;</span>
        <span style="color:#4f9d08">ShortcutEditorModelItem</span> <span style="color:#ffffff">*</span><span style="color:#ffffff">m_parentItem</span><span style="color:#ffffff">;</span>
    <span style="color:#ffffff">};</span>

<span style="color:#ffff55">public</span><span style="color:#ffffff">:</span>
    <span style="color:#ffff55">explicit</span> <span style="color:#4f9d08">ShortcutEditorModel</span><span style="color:#ffffff">(</span><a data-cke-saved-href="https://doc.qt.io/qt-6/qobject.html" href="https://doc.qt.io/qt-6/qobject.html"><span style="color:#21be2b">QObject</span></a> <span style="color:#ffffff">*</span><span style="color:#ffffff">parent </span><span style="color:#ffffff">=</span> <span style="color:#ffff55">nullptr</span><span style="color:#ffffff">);</span>
    <span style="color:#ffffff">~</span><span style="color:#4f9d08">ShortcutEditorModel</span><span style="color:#ffffff">()</span> <span style="color:#ffff55">override</span><span style="color:#ffffff">;</span>

    <a data-cke-saved-href="https://doc.qt.io/qt-6/qvariant.html" href="https://doc.qt.io/qt-6/qvariant.html"><span style="color:#21be2b">QVariant</span></a><span style="color:#ffffff"> data</span><span style="color:#ffffff">(</span><span style="color:#ffff55">const</span> <a data-cke-saved-href="https://doc.qt.io/qt-6/qmodelindex.html" href="https://doc.qt.io/qt-6/qmodelindex.html"><span style="color:#21be2b">QModelIndex</span></a> <span style="color:#ffffff">&</span><span style="color:#ffffff">index</span><span style="color:#ffffff">,</span> <span style="color:#ffff55">int</span><span style="color:#ffffff"> role </span><span style="color:#ffffff">=</span> <a data-cke-saved-href="https://doc.qt.io/qt-6/qt.html" href="https://doc.qt.io/qt-6/qt.html"><span style="color:#21be2b">Qt</span></a><span style="color:#ffffff">::</span><span style="color:#4f9d08">DisplayRole</span><span style="color:#ffffff">)</span> <span style="color:#ffff55">const</span> <span style="color:#ffff55">override</span><span style="color:#ffffff">;</span>
    <a data-cke-saved-href="https://doc.qt.io/qt-6/qt.html" href="https://doc.qt.io/qt-6/qt.html"><span style="color:#21be2b">Qt</span></a><span style="color:#ffffff">::</span><span style="color:#4f9d08">ItemFlags</span><span style="color:#ffffff"> flags</span><span style="color:#ffffff">(</span><span style="color:#ffff55">const</span> <a data-cke-saved-href="https://doc.qt.io/qt-6/qmodelindex.html" href="https://doc.qt.io/qt-6/qmodelindex.html"><span style="color:#21be2b">QModelIndex</span></a> <span style="color:#ffffff">&</span><span style="color:#ffffff">index</span><span style="color:#ffffff">)</span> <span style="color:#ffff55">const</span> <span style="color:#ffff55">override</span><span style="color:#ffffff">;</span>
    <a data-cke-saved-href="https://doc.qt.io/qt-6/qvariant.html" href="https://doc.qt.io/qt-6/qvariant.html"><span style="color:#21be2b">QVariant</span></a><span style="color:#ffffff"> headerData</span><span style="color:#ffffff">(</span><span style="color:#ffff55">int</span><span style="color:#ffffff"> section</span><span style="color:#ffffff">,</span> <a data-cke-saved-href="https://doc.qt.io/qt-6/qt.html" href="https://doc.qt.io/qt-6/qt.html"><span style="color:#21be2b">Qt</span></a><span style="color:#ffffff">::</span><span style="color:#4f9d08">Orientation</span><span style="color:#ffffff"> orientation</span><span style="color:#ffffff">,</span> <span style="color:#ffff55">int</span><span style="color:#ffffff"> role </span><span style="color:#ffffff">=</span> <a data-cke-saved-href="https://doc.qt.io/qt-6/qt.html" href="https://doc.qt.io/qt-6/qt.html"><span style="color:#21be2b">Qt</span></a><span style="color:#ffffff">::</span><span style="color:#4f9d08">DisplayRole</span><span style="color:#ffffff">)</span> <span style="color:#ffff55">const</span> <span style="color:#ffff55">override</span><span style="color:#ffffff">;</span>
    <a data-cke-saved-href="https://doc.qt.io/qt-6/qmodelindex.html" href="https://doc.qt.io/qt-6/qmodelindex.html"><span style="color:#21be2b">QModelIndex</span></a><span style="color:#ffffff"> index</span><span style="color:#ffffff">(</span><span style="color:#ffff55">int</span><span style="color:#ffffff"> row</span><span style="color:#ffffff">,</span> <span style="color:#ffff55">int</span><span style="color:#ffffff"> column</span><span style="color:#ffffff">,</span> <span style="color:#ffff55">const</span> <a data-cke-saved-href="https://doc.qt.io/qt-6/qmodelindex.html" href="https://doc.qt.io/qt-6/qmodelindex.html"><span style="color:#21be2b">QModelIndex</span></a> <span style="color:#ffffff">&</span><span style="color:#ffffff">parent </span><span style="color:#ffffff">=</span> <a data-cke-saved-href="https://doc.qt.io/qt-6/qmodelindex.html" href="https://doc.qt.io/qt-6/qmodelindex.html"><span style="color:#21be2b">QModelIndex</span></a><span style="color:#ffffff">())</span> <span style="color:#ffff55">const</span> <span style="color:#ffff55">override</span><span style="color:#ffffff">;</span>
    <a data-cke-saved-href="https://doc.qt.io/qt-6/qmodelindex.html" href="https://doc.qt.io/qt-6/qmodelindex.html"><span style="color:#21be2b">QModelIndex</span></a><span style="color:#ffffff"> parent</span><span style="color:#ffffff">(</span><span style="color:#ffff55">const</span> <a data-cke-saved-href="https://doc.qt.io/qt-6/qmodelindex.html" href="https://doc.qt.io/qt-6/qmodelindex.html"><span style="color:#21be2b">QModelIndex</span></a> <span style="color:#ffffff">&</span><span style="color:#ffffff">index</span><span style="color:#ffffff">)</span> <span style="color:#ffff55">const</span> <span style="color:#ffff55">override</span><span style="color:#ffffff">;</span>
    <span style="color:#ffff55">int</span><span style="color:#ffffff"> rowCount</span><span style="color:#ffffff">(</span><span style="color:#ffff55">const</span> <a data-cke-saved-href="https://doc.qt.io/qt-6/qmodelindex.html" href="https://doc.qt.io/qt-6/qmodelindex.html"><span style="color:#21be2b">QModelIndex</span></a> <span style="color:#ffffff">&</span><span style="color:#ffffff">index </span><span style="color:#ffffff">=</span> <a data-cke-saved-href="https://doc.qt.io/qt-6/qmodelindex.html" href="https://doc.qt.io/qt-6/qmodelindex.html"><span style="color:#21be2b">QModelIndex</span></a><span style="color:#ffffff">())</span> <span style="color:#ffff55">const</span> <span style="color:#ffff55">override</span><span style="color:#ffffff">;</span>
    <span style="color:#ffff55">int</span><span style="color:#ffffff"> columnCount</span><span style="color:#ffffff">(</span><span style="color:#ffff55">const</span> <a data-cke-saved-href="https://doc.qt.io/qt-6/qmodelindex.html" href="https://doc.qt.io/qt-6/qmodelindex.html"><span style="color:#21be2b">QModelIndex</span></a> <span style="color:#ffffff">&</span><span style="color:#ffffff">index </span><span style="color:#ffffff">=</span> <a data-cke-saved-href="https://doc.qt.io/qt-6/qmodelindex.html" href="https://doc.qt.io/qt-6/qmodelindex.html"><span style="color:#21be2b">QModelIndex</span></a><span style="color:#ffffff">())</span> <span style="color:#ffff55">const</span> <span style="color:#ffff55">override</span><span style="color:#ffffff">;</span>

    <span style="color:#ffff55">bool</span><span style="color:#ffffff"> setData</span><span style="color:#ffffff">(</span><span style="color:#ffff55">const</span> <a data-cke-saved-href="https://doc.qt.io/qt-6/qmodelindex.html" href="https://doc.qt.io/qt-6/qmodelindex.html"><span style="color:#21be2b">QModelIndex</span></a> <span style="color:#ffffff">&</span><span style="color:#ffffff">index</span><span style="color:#ffffff">,</span> <span style="color:#ffff55">const</span> <a data-cke-saved-href="https://doc.qt.io/qt-6/qvariant.html" href="https://doc.qt.io/qt-6/qvariant.html"><span style="color:#21be2b">QVariant</span></a> <span style="color:#ffffff">&</span><span style="color:#ffffff">value</span><span style="color:#ffffff">,</span> <span style="color:#ffff55">int</span><span style="color:#ffffff"> role </span><span style="color:#ffffff">=</span> <a data-cke-saved-href="https://doc.qt.io/qt-6/qt.html" href="https://doc.qt.io/qt-6/qt.html"><span style="color:#21be2b">Qt</span></a><span style="color:#ffffff">::</span><span style="color:#4f9d08">EditRole</span><span style="color:#ffffff">)</span> <span style="color:#ffff55">override</span><span style="color:#ffffff">;</span>

    <span style="color:#ffff55">void</span><span style="color:#ffffff"> setActions</span><span style="color:#ffffff">();</span>

<span style="color:#ffff55">private</span><span style="color:#ffffff">:</span>
    <span style="color:#ffff55">void</span><span style="color:#ffffff"> setupModelData</span><span style="color:#ffffff">(</span><span style="color:#4f9d08">ShortcutEditorModelItem</span> <span style="color:#ffffff">*</span><span style="color:#ffffff">parent</span><span style="color:#ffffff">);</span>

    <span style="color:#4f9d08">ShortcutEditorModelItem</span> <span style="color:#ffffff">*</span><span style="color:#ffffff">m_rootItem</span><span style="color:#ffffff">;</span>
<span style="color:#ffffff">};</span></span></span></span>

此类类似于提供读写模型的大多数其他子类。只有构造函数和函数的形式特定于此模型。此外,我们提供了一个析构函数,以便在模型被销毁时进行清理。setupModelData()

快捷方式编辑器模型类实现

构造函数采用一个参数,其中包含模型将与视图和委托共享的数据:

<span style="color:#404244"><span style="background-color:#3a4055"><span style="color:#ffffff"><span style="color:#4f9d08">ShortcutEditorModel</span><span style="color:#ffffff">::</span><span style="color:#4f9d08">ShortcutEditorModel</span><span style="color:#ffffff">(</span><a data-cke-saved-href="https://doc.qt.io/qt-6/qobject.html" href="https://doc.qt.io/qt-6/qobject.html"><span style="color:#21be2b">QObject</span></a> <span style="color:#ffffff">*</span><span style="color:#ffffff">parent</span><span style="color:#ffffff">)</span>
    <span style="color:#ffffff">:</span> <a data-cke-saved-href="https://doc.qt.io/qt-6/qabstractitemmodel.html" href="https://doc.qt.io/qt-6/qabstractitemmodel.html"><span style="color:#21be2b">QAbstractItemModel</span></a><span style="color:#ffffff">(</span><span style="color:#ffffff">parent</span><span style="color:#ffffff">)</span>
<span style="color:#ffffff">{</span><span style="color:#ffffff">
    m_rootItem </span><span style="color:#ffffff">=</span> <span style="color:#ffff55">new</span> <span style="color:#4f9d08">ShortcutEditorModelItem</span><span style="color:#ffffff">({</span><span style="color:#ffffff">tr</span><span style="color:#ffffff">(</span><span style="color:#aaaaaa">"Name"</span><span style="color:#ffffff">)</span><span style="color:#ffffff">,</span><span style="color:#ffffff"> tr</span><span style="color:#ffffff">(</span><span style="color:#aaaaaa">"Shortcut"</span><span style="color:#ffffff">)});</span>
<span style="color:#ffffff">}</span></span></span></span>

由构造函数为模型创建根项。为方便起见,此项仅包含垂直标题数据。我们还使用它来引用包含模型数据的内部数据结构,并使用它来表示模型中顶级项的假想父项。

模型的内部数据结构由函数填充项。我们将在本文档末尾单独检查此函数。setupModelData()

析构函数确保在销毁模型时删除根项及其所有后代:

<span style="color:#404244"><span style="background-color:#3a4055"><span style="color:#ffffff"><span style="color:#4f9d08">ShortcutEditorModel</span><span style="color:#ffffff">::</span><span style="color:#ffffff">~</span><span style="color:#4f9d08">ShortcutEditorModel</span><span style="color:#ffffff">()</span>
<span style="color:#ffffff">{</span>
    <span style="color:#ffff55">delete</span><span style="color:#ffffff"> m_rootItem</span><span style="color:#ffffff">;</span>
<span style="color:#ffffff">}</span></span></span></span>

由于我们无法在构建和设置模型后向模型添加数据,因此这简化了管理项的内部树的方式。

模型必须实现一个函数,为视图和委托提供索引,以便在访问数据时使用。当其他组件的行号和列号及其父模型索引引用这些组件时,将为这些组件创建索引。如果将无效的模型索引指定为父项,则由模型返回与模型中的顶级项对应的索引。index()

当提供模型索引时,我们首先检查它是否有效。如果不是,我们假设引用了顶级项目;否则,我们使用其 () 函数从模型索引获取数据指针,并使用它来引用对象。请注意,我们构造的所有模型索引都将包含一个指向现有 的指针,因此我们可以保证我们收到的任何有效模型索引都将包含有效的数据指针。TreeItemTreeItem

<span style="color:#404244"><span style="background-color:#3a4055"><span style="color:#ffffff"><span style="color:#ffff55">void</span> <span style="color:#4f9d08">ShortcutEditorModel</span><span style="color:#ffffff">::</span><span style="color:#ffffff">setActions</span><span style="color:#ffffff">()</span>
<span style="color:#ffffff">{</span><span style="color:#ffffff">
    beginResetModel</span><span style="color:#ffffff">();</span><span style="color:#ffffff">
    setupModelData</span><span style="color:#ffffff">(</span><span style="color:#ffffff">m_rootItem</span><span style="color:#ffffff">);</span><span style="color:#ffffff">
    endResetModel</span><span style="color:#ffffff">();</span>
<span style="color:#ffffff">}</span></span></span></span>

由于此函数的行和列参数引用相应父项的子项,因此我们使用函数获取该项。() 函数用于创建要返回的模型索引。我们指定行号和列号,以及指向项目本身的指针。以后可以使用模型索引来获取项目的数据。TreeItem::child()

定义对象的方式使编写函数变得容易:TreeItemparent()

<span style="color:#404244"><span style="background-color:#3a4055"><span style="color:#ffffff"><a data-cke-saved-href="https://doc.qt.io/qt-6/qmodelindex.html" href="https://doc.qt.io/qt-6/qmodelindex.html"><span style="color:#21be2b">QModelIndex</span></a> <span style="color:#4f9d08">ShortcutEditorModel</span><span style="color:#ffffff">::</span><span style="color:#ffffff">index</span><span style="color:#ffffff">(</span><span style="color:#ffff55">int</span><span style="color:#ffffff"> row</span><span style="color:#ffffff">,</span> <span style="color:#ffff55">int</span><span style="color:#ffffff"> column</span><span style="color:#ffffff">,</span> <span style="color:#ffff55">const</span> <a data-cke-saved-href="https://doc.qt.io/qt-6/qmodelindex.html" href="https://doc.qt.io/qt-6/qmodelindex.html"><span style="color:#21be2b">QModelIndex</span></a> <span style="color:#ffffff">&</span><span style="color:#ffffff">parent</span><span style="color:#ffffff">)</span> <span style="color:#ffff55">const</span>
<span style="color:#ffffff">{</span>
    <span style="color:#ffff55">if</span> <span style="color:#ffffff">(</span><span style="color:#ffffff">!</span><span style="color:#ffffff">hasIndex</span><span style="color:#ffffff">(</span><span style="color:#ffffff">row</span><span style="color:#ffffff">,</span><span style="color:#ffffff"> column</span><span style="color:#ffffff">,</span><span style="color:#ffffff"> parent</span><span style="color:#ffffff">))</span>
        <span style="color:#ffff55">return</span> <a data-cke-saved-href="https://doc.qt.io/qt-6/qmodelindex.html" href="https://doc.qt.io/qt-6/qmodelindex.html"><span style="color:#21be2b">QModelIndex</span></a><span style="color:#ffffff">();</span>

    <span style="color:#4f9d08">ShortcutEditorModelItem</span> <span style="color:#ffffff">*</span><span style="color:#ffffff">parentItem</span><span style="color:#ffffff">;</span>
    <span style="color:#ffff55">if</span> <span style="color:#ffffff">(</span><span style="color:#ffffff">!</span><span style="color:#ffffff">parent</span><span style="color:#ffffff">.</span><span style="color:#ffffff">isValid</span><span style="color:#ffffff">())</span><span style="color:#ffffff">
        parentItem </span><span style="color:#ffffff">=</span><span style="color:#ffffff"> m_rootItem</span><span style="color:#ffffff">;</span>
    <span style="color:#ffff55">else</span><span style="color:#ffffff">
        parentItem </span><span style="color:#ffffff">=</span> <span style="color:#ffff55">static_cast</span><span style="color:#ffffff"><</span><span style="color:#4f9d08">ShortcutEditorModelItem</span><span style="color:#ffffff">*</span><span style="color:#ffffff">></span><span style="color:#ffffff">(</span><span style="color:#ffffff">parent</span><span style="color:#ffffff">.</span><span style="color:#ffffff">internalPointer</span><span style="color:#ffffff">());</span>

    <span style="color:#4f9d08">ShortcutEditorModelItem</span> <span style="color:#ffffff">*</span><span style="color:#ffffff">childItem </span><span style="color:#ffffff">=</span><span style="color:#ffffff"> parentItem</span><span style="color:#ffffff">-</span><span style="color:#ffffff">></span><span style="color:#ffffff">child</span><span style="color:#ffffff">(</span><span style="color:#ffffff">row</span><span style="color:#ffffff">);</span>
    <span style="color:#ffff55">if</span> <span style="color:#ffffff">(</span><span style="color:#ffffff">childItem</span><span style="color:#ffffff">)</span>
        <span style="color:#ffff55">return</span><span style="color:#ffffff"> createIndex</span><span style="color:#ffffff">(</span><span style="color:#ffffff">row</span><span style="color:#ffffff">,</span><span style="color:#ffffff"> column</span><span style="color:#ffffff">,</span><span style="color:#ffffff"> childItem</span><span style="color:#ffffff">);</span>

    <span style="color:#ffff55">return</span> <a data-cke-saved-href="https://doc.qt.io/qt-6/qmodelindex.html" href="https://doc.qt.io/qt-6/qmodelindex.html"><span style="color:#21be2b">QModelIndex</span></a><span style="color:#ffffff">();</span>
<span style="color:#ffffff">}</span></span></span></span>

我们只需要确保永远不会返回与根项对应的模型索引。为了与函数的实现方式保持一致,我们为模型中任何顶级项的父项返回无效的模型索引。index()

创建要返回的模型索引时,我们必须在其自己的父项中指定父项的行号和列号。我们可以使用该函数轻松发现行号,但我们遵循将 0 指定为父项的列号的约定。使用 () 创建模型索引的方式与在函数中创建的方式相同。TreeItem::row()index()

该函数仅返回与给定模型索引对应的 的子项数,或者如果指定了无效索引,则返回顶级项数:rowCount()TreeItem

<span style="color:#404244"><span style="background-color:#3a4055"><span style="color:#ffffff"><a data-cke-saved-href="https://doc.qt.io/qt-6/qmodelindex.html" href="https://doc.qt.io/qt-6/qmodelindex.html"><span style="color:#21be2b">QModelIndex</span></a> <span style="color:#4f9d08">ShortcutEditorModel</span><span style="color:#ffffff">::</span><span style="color:#ffffff">parent</span><span style="color:#ffffff">(</span><span style="color:#ffff55">const</span> <a data-cke-saved-href="https://doc.qt.io/qt-6/qmodelindex.html" href="https://doc.qt.io/qt-6/qmodelindex.html"><span style="color:#21be2b">QModelIndex</span></a> <span style="color:#ffffff">&</span><span style="color:#ffffff">index</span><span style="color:#ffffff">)</span> <span style="color:#ffff55">const</span>
<span style="color:#ffffff">{</span>
    <span style="color:#ffff55">if</span> <span style="color:#ffffff">(</span><span style="color:#ffffff">!</span><span style="color:#ffffff">index</span><span style="color:#ffffff">.</span><span style="color:#ffffff">isValid</span><span style="color:#ffffff">())</span>
        <span style="color:#ffff55">return</span> <a data-cke-saved-href="https://doc.qt.io/qt-6/qmodelindex.html" href="https://doc.qt.io/qt-6/qmodelindex.html"><span style="color:#21be2b">QModelIndex</span></a><span style="color:#ffffff">();</span>

    <span style="color:#4f9d08">ShortcutEditorModelItem</span> <span style="color:#ffffff">*</span><span style="color:#ffffff">childItem </span><span style="color:#ffffff">=</span> <span style="color:#ffff55">static_cast</span><span style="color:#ffffff"><</span><span style="color:#4f9d08">ShortcutEditorModelItem</span><span style="color:#ffffff">*</span><span style="color:#ffffff">></span><span style="color:#ffffff">(</span><span style="color:#ffffff">index</span><span style="color:#ffffff">.</span><span style="color:#ffffff">internalPointer</span><span style="color:#ffffff">());</span>
    <span style="color:#4f9d08">ShortcutEditorModelItem</span> <span style="color:#ffffff">*</span><span style="color:#ffffff">parentItem </span><span style="color:#ffffff">=</span><span style="color:#ffffff"> childItem</span><span style="color:#ffffff">-</span><span style="color:#ffffff">></span><span style="color:#ffffff">parentItem</span><span style="color:#ffffff">();</span>

    <span style="color:#ffff55">if</span> <span style="color:#ffffff">(</span><span style="color:#ffffff">parentItem </span><span style="color:#ffffff">=</span><span style="color:#ffffff">=</span><span style="color:#ffffff"> m_rootItem</span><span style="color:#ffffff">)</span>
        <span style="color:#ffff55">return</span> <a data-cke-saved-href="https://doc.qt.io/qt-6/qmodelindex.html" href="https://doc.qt.io/qt-6/qmodelindex.html"><span style="color:#21be2b">QModelIndex</span></a><span style="color:#ffffff">();</span>

    <span style="color:#ffff55">return</span><span style="color:#ffffff"> createIndex</span><span style="color:#ffffff">(</span><span style="color:#ffffff">parentItem</span><span style="color:#ffffff">-</span><span style="color:#ffffff">></span><span style="color:#ffffff">row</span><span style="color:#ffffff">()</span><span style="color:#ffffff">,</span> <span style="color:#ff55ff">0</span><span style="color:#ffffff">,</span><span style="color:#ffffff"> parentItem</span><span style="color:#ffffff">);</span>
<span style="color:#ffffff">}</span></span></span></span>

由于每个项管理自己的列数据,因此该函数必须调用该项自己的函数来确定给定模型索引存在多少列。与函数一样,如果指定了无效的模型索引,则返回的列数由根项确定:columnCount()columnCount()rowCount()

<span style="color:#404244"><span style="background-color:#3a4055"><span style="color:#ffffff"><span style="color:#ffff55">int</span> <span style="color:#4f9d08">ShortcutEditorModel</span><span style="color:#ffffff">::</span><span style="color:#ffffff">rowCount</span><span style="color:#ffffff">(</span><span style="color:#ffff55">const</span> <a data-cke-saved-href="https://doc.qt.io/qt-6/qmodelindex.html" href="https://doc.qt.io/qt-6/qmodelindex.html"><span style="color:#21be2b">QModelIndex</span></a> <span style="color:#ffffff">&</span><span style="color:#ffffff">parent</span><span style="color:#ffffff">)</span> <span style="color:#ffff55">const</span>
<span style="color:#ffffff">{</span>
    <span style="color:#4f9d08">ShortcutEditorModelItem</span> <span style="color:#ffffff">*</span><span style="color:#ffffff">parentItem</span><span style="color:#ffffff">;</span>
    <span style="color:#ffff55">if</span> <span style="color:#ffffff">(</span><span style="color:#ffffff">parent</span><span style="color:#ffffff">.</span><span style="color:#ffffff">column</span><span style="color:#ffffff">()</span> <span style="color:#ffffff">></span> <span style="color:#ff55ff">0</span><span style="color:#ffffff">)</span>
        <span style="color:#ffff55">return</span> <span style="color:#ff55ff">0</span><span style="color:#ffffff">;</span>

    <span style="color:#ffff55">if</span> <span style="color:#ffffff">(</span><span style="color:#ffffff">!</span><span style="color:#ffffff">parent</span><span style="color:#ffffff">.</span><span style="color:#ffffff">isValid</span><span style="color:#ffffff">())</span><span style="color:#ffffff">
        parentItem </span><span style="color:#ffffff">=</span><span style="color:#ffffff"> m_rootItem</span><span style="color:#ffffff">;</span>
    <span style="color:#ffff55">else</span><span style="color:#ffffff">
        parentItem </span><span style="color:#ffffff">=</span> <span style="color:#ffff55">static_cast</span><span style="color:#ffffff"><</span><span style="color:#4f9d08">ShortcutEditorModelItem</span><span style="color:#ffffff">*</span><span style="color:#ffffff">></span><span style="color:#ffffff">(</span><span style="color:#ffffff">parent</span><span style="color:#ffffff">.</span><span style="color:#ffffff">internalPointer</span><span style="color:#ffffff">());</span>

    <span style="color:#ffff55">return</span><span style="color:#ffffff"> parentItem</span><span style="color:#ffffff">-</span><span style="color:#ffffff">></span><span style="color:#ffffff">childCount</span><span style="color:#ffffff">();</span>
<span style="color:#ffffff">}</span></span></span></span>

数据是通过 从模型中获取的。由于项目管理自己的列,我们需要使用列号通过以下函数检索数据:data()TreeItem::data()

<span style="color:#404244"><span style="background-color:#3a4055"><span style="color:#ffffff"><span style="color:#ffff55">int</span> <span style="color:#4f9d08">ShortcutEditorModel</span><span style="color:#ffffff">::</span><span style="color:#ffffff">columnCount</span><span style="color:#ffffff">(</span><span style="color:#ffff55">const</span> <a data-cke-saved-href="https://doc.qt.io/qt-6/qmodelindex.html" href="https://doc.qt.io/qt-6/qmodelindex.html"><span style="color:#21be2b">QModelIndex</span></a> <span style="color:#ffffff">&</span><span style="color:#ffffff">parent</span><span style="color:#ffffff">)</span> <span style="color:#ffff55">const</span>
<span style="color:#ffffff">{</span>
    <span style="color:#ffff55">if</span> <span style="color:#ffffff">(</span><span style="color:#ffffff">parent</span><span style="color:#ffffff">.</span><span style="color:#ffffff">isValid</span><span style="color:#ffffff">())</span>
        <span style="color:#ffff55">return</span> <span style="color:#ffff55">static_cast</span><span style="color:#ffffff"><</span><span style="color:#4f9d08">ShortcutEditorModelItem</span><span style="color:#ffffff">*</span><span style="color:#ffffff">></span><span style="color:#ffffff">(</span><span style="color:#ffffff">parent</span><span style="color:#ffffff">.</span><span style="color:#ffffff">internalPointer</span><span style="color:#ffffff">())</span><span style="color:#ffffff">-</span><span style="color:#ffffff">></span><span style="color:#ffffff">columnCount</span><span style="color:#ffffff">();</span>

    <span style="color:#ffff55">return</span><span style="color:#ffffff"> m_rootItem</span><span style="color:#ffffff">-</span><span style="color:#ffffff">></span><span style="color:#ffffff">columnCount</span><span style="color:#ffffff">();</span>
<span style="color:#ffffff">}</span></span></span></span>

请注意,我们在此实现中仅支持 ,并且我们还为无效模型索引返回无效对象。

我们使用该函数来确保视图知道模型是只读的:flags()

<span style="color:#404244"><span style="background-color:#3a4055"><span style="color:#ffffff"><a data-cke-saved-href="https://doc.qt.io/qt-6/qvariant.html" href="https://doc.qt.io/qt-6/qvariant.html"><span style="color:#21be2b">QVariant</span></a> <span style="color:#4f9d08">ShortcutEditorModel</span><span style="color:#ffffff">::</span><span style="color:#ffffff">data</span><span style="color:#ffffff">(</span><span style="color:#ffff55">const</span> <a data-cke-saved-href="https://doc.qt.io/qt-6/qmodelindex.html" href="https://doc.qt.io/qt-6/qmodelindex.html"><span style="color:#21be2b">QModelIndex</span></a> <span style="color:#ffffff">&</span><span style="color:#ffffff">index</span><span style="color:#ffffff">,</span> <span style="color:#ffff55">int</span><span style="color:#ffffff"> role</span><span style="color:#ffffff">)</span> <span style="color:#ffff55">const</span>
<span style="color:#ffffff">{</span>
    <span style="color:#ffff55">if</span> <span style="color:#ffffff">(</span><span style="color:#ffffff">!</span><span style="color:#ffffff">index</span><span style="color:#ffffff">.</span><span style="color:#ffffff">isValid</span><span style="color:#ffffff">())</span>
        <span style="color:#ffff55">return</span> <a data-cke-saved-href="https://doc.qt.io/qt-6/qvariant.html" href="https://doc.qt.io/qt-6/qvariant.html"><span style="color:#21be2b">QVariant</span></a><span style="color:#ffffff">();</span>

    <span style="color:#ffff55">if</span> <span style="color:#ffffff">(</span><span style="color:#ffffff">role </span><span style="color:#ffffff">!</span><span style="color:#ffffff">=</span> <a data-cke-saved-href="https://doc.qt.io/qt-6/qt.html" href="https://doc.qt.io/qt-6/qt.html"><span style="color:#21be2b">Qt</span></a><span style="color:#ffffff">::</span><span style="color:#4f9d08">DisplayRole</span> <span style="color:#ffffff">&</span><span style="color:#ffffff">&</span><span style="color:#ffffff"> role </span><span style="color:#ffffff">!</span><span style="color:#ffffff">=</span> <a data-cke-saved-href="https://doc.qt.io/qt-6/qt.html" href="https://doc.qt.io/qt-6/qt.html"><span style="color:#21be2b">Qt</span></a><span style="color:#ffffff">::</span><span style="color:#4f9d08">EditRole</span><span style="color:#ffffff">)</span>
        <span style="color:#ffff55">return</span> <a data-cke-saved-href="https://doc.qt.io/qt-6/qvariant.html" href="https://doc.qt.io/qt-6/qvariant.html"><span style="color:#21be2b">QVariant</span></a><span style="color:#ffffff">();</span>

    <span style="color:#4f9d08">ShortcutEditorModelItem</span> <span style="color:#ffffff">*</span><span style="color:#ffffff">item </span><span style="color:#ffffff">=</span> <span style="color:#ffff55">static_cast</span><span style="color:#ffffff"><</span><span style="color:#4f9d08">ShortcutEditorModelItem</span><span style="color:#ffffff">*</span><span style="color:#ffffff">></span><span style="color:#ffffff">(</span><span style="color:#ffffff">index</span><span style="color:#ffffff">.</span><span style="color:#ffffff">internalPointer</span><span style="color:#ffffff">());</span>
    <span style="color:#ffff55">return</span><span style="color:#ffffff"> item</span><span style="color:#ffffff">-</span><span style="color:#ffffff">></span><span style="color:#ffffff">data</span><span style="color:#ffffff">(</span><span style="color:#ffffff">index</span><span style="color:#ffffff">.</span><span style="color:#ffffff">column</span><span style="color:#ffffff">());</span>
<span style="color:#ffffff">}</span></span></span></span>

该函数返回我们方便地存储在根项中的数据:headerData()

<span style="color:#404244"><span style="background-color:#3a4055"><span style="color:#ffffff"><a data-cke-saved-href="https://doc.qt.io/qt-6/qt.html" href="https://doc.qt.io/qt-6/qt.html"><span style="color:#21be2b">Qt</span></a><span style="color:#ffffff">::</span><span style="color:#4f9d08">ItemFlags</span> <span style="color:#4f9d08">ShortcutEditorModel</span><span style="color:#ffffff">::</span><span style="color:#ffffff">flags</span><span style="color:#ffffff">(</span><span style="color:#ffff55">const</span> <a data-cke-saved-href="https://doc.qt.io/qt-6/qmodelindex.html" href="https://doc.qt.io/qt-6/qmodelindex.html"><span style="color:#21be2b">QModelIndex</span></a> <span style="color:#ffffff">&</span><span style="color:#ffffff">index</span><span style="color:#ffffff">)</span> <span style="color:#ffff55">const</span>
<span style="color:#ffffff">{</span>
    <span style="color:#ffff55">if</span> <span style="color:#ffffff">(</span><span style="color:#ffffff">!</span><span style="color:#ffffff">index</span><span style="color:#ffffff">.</span><span style="color:#ffffff">isValid</span><span style="color:#ffffff">())</span>
        <span style="color:#ffff55">return</span> <a data-cke-saved-href="https://doc.qt.io/qt-6/qt.html" href="https://doc.qt.io/qt-6/qt.html"><span style="color:#21be2b">Qt</span></a><span style="color:#ffffff">::</span><span style="color:#4f9d08">NoItemFlags</span><span style="color:#ffffff">;</span>

    <a data-cke-saved-href="https://doc.qt.io/qt-6/qt.html" href="https://doc.qt.io/qt-6/qt.html"><span style="color:#21be2b">Qt</span></a><span style="color:#ffffff">::</span><span style="color:#4f9d08">ItemFlags</span><span style="color:#ffffff"> modelFlags </span><span style="color:#ffffff">=</span> <a data-cke-saved-href="https://doc.qt.io/qt-6/qabstractitemmodel.html" href="https://doc.qt.io/qt-6/qabstractitemmodel.html"><span style="color:#21be2b">QAbstractItemModel</span></a><span style="color:#ffffff">::</span><span style="color:#ffffff">flags</span><span style="color:#ffffff">(</span><span style="color:#ffffff">index</span><span style="color:#ffffff">);</span>
    <span style="color:#ffff55">if</span> <span style="color:#ffffff">(</span><span style="color:#ffffff">index</span><span style="color:#ffffff">.</span><span style="color:#ffffff">column</span><span style="color:#ffffff">()</span> <span style="color:#ffffff">=</span><span style="color:#ffffff">=</span> <span style="color:#ffff55">static_cast</span><span style="color:#aaaaaa"><</span><span style="color:#aaaaaa">int</span><span style="color:#aaaaaa">></span><span style="color:#ffffff">(</span><span style="color:#4f9d08">Column</span><span style="color:#ffffff">::</span><span style="color:#4f9d08">Shortcut</span><span style="color:#ffffff">))</span><span style="color:#ffffff">
        modelFlags </span><span style="color:#ffffff">|</span><span style="color:#ffffff">=</span> <a data-cke-saved-href="https://doc.qt.io/qt-6/qt.html" href="https://doc.qt.io/qt-6/qt.html"><span style="color:#21be2b">Qt</span></a><span style="color:#ffffff">::</span><span style="color:#4f9d08">ItemIsEditable</span><span style="color:#ffffff">;</span>

    <span style="color:#ffff55">return</span><span style="color:#ffffff"> modelFlags</span><span style="color:#ffffff">;</span>
<span style="color:#ffffff">}</span></span></span></span>

此信息可能以不同的方式提供:在构造函数中指定,或硬编码到函数中。headerData()

<span style="color:#404244"><span style="background-color:#3a4055"><span style="color:#ffffff"><a data-cke-saved-href="https://doc.qt.io/qt-6/qvariant.html" href="https://doc.qt.io/qt-6/qvariant.html"><span style="color:#21be2b">QVariant</span></a> <span style="color:#4f9d08">ShortcutEditorModel</span><span style="color:#ffffff">::</span><span style="color:#ffffff">headerData</span><span style="color:#ffffff">(</span><span style="color:#ffff55">int</span><span style="color:#ffffff"> section</span><span style="color:#ffffff">,</span> <a data-cke-saved-href="https://doc.qt.io/qt-6/qt.html" href="https://doc.qt.io/qt-6/qt.html"><span style="color:#21be2b">Qt</span></a><span style="color:#ffffff">::</span><span style="color:#4f9d08">Orientation</span><span style="color:#ffffff"> orientation</span><span style="color:#ffffff">,</span> <span style="color:#ffff55">int</span><span style="color:#ffffff"> role</span><span style="color:#ffffff">)</span> <span style="color:#ffff55">const</span>
<span style="color:#ffffff">{</span>
    <span style="color:#ffff55">if</span> <span style="color:#ffffff">(</span><span style="color:#ffffff">orientation </span><span style="color:#ffffff">=</span><span style="color:#ffffff">=</span> <a data-cke-saved-href="https://doc.qt.io/qt-6/qt.html" href="https://doc.qt.io/qt-6/qt.html"><span style="color:#21be2b">Qt</span></a><span style="color:#ffffff">::</span><span style="color:#4f9d08">Horizontal</span> <span style="color:#ffffff">&</span><span style="color:#ffffff">&</span><span style="color:#ffffff"> role </span><span style="color:#ffffff">=</span><span style="color:#ffffff">=</span> <a data-cke-saved-href="https://doc.qt.io/qt-6/qt.html" href="https://doc.qt.io/qt-6/qt.html"><span style="color:#21be2b">Qt</span></a><span style="color:#ffffff">::</span><span style="color:#4f9d08">DisplayRole</span><span style="color:#ffffff">)</span> <span style="color:#ffffff">{</span>
        <span style="color:#ffff55">return</span><span style="color:#ffffff"> m_rootItem</span><span style="color:#ffffff">-</span><span style="color:#ffffff">></span><span style="color:#ffffff">data</span><span style="color:#ffffff">(</span><span style="color:#ffffff">section</span><span style="color:#ffffff">);</span>
    <span style="color:#ffffff">}</span>

    <span style="color:#ffff55">return</span> <a data-cke-saved-href="https://doc.qt.io/qt-6/qvariant.html" href="https://doc.qt.io/qt-6/qvariant.html"><span style="color:#21be2b">QVariant</span></a><span style="color:#ffffff">();</span>
<span style="color:#ffffff">}</span></span></span></span>

待办事项

<span style="color:#404244"><span style="background-color:#3a4055"><span style="color:#ffffff"><span style="color:#ffff55">void</span> <span style="color:#4f9d08">ShortcutEditorModel</span><span style="color:#ffffff">::</span><span style="color:#ffffff">setupModelData</span><span style="color:#ffffff">(</span><span style="color:#4f9d08">ShortcutEditorModelItem</span> <span style="color:#ffffff">*</span><span style="color:#ffffff">parent</span><span style="color:#ffffff">)</span>
<span style="color:#ffffff">{</span>
    <span style="color:#4f9d08">ActionsMap</span><span style="color:#ffffff"> actionsMap</span><span style="color:#ffffff">;</span>
    <span style="color:#4f9d08">Application</span> <span style="color:#ffffff">*</span><span style="color:#ffffff">application </span><span style="color:#ffffff">=</span> <span style="color:#ffff55">static_cast</span><span style="color:#ffffff"><</span><span style="color:#4f9d08">Application</span> <span style="color:#ffffff">*</span><span style="color:#ffffff">></span><span style="color:#ffffff">(</span><a data-cke-saved-href="https://doc.qt.io/qt-6/qcoreapplication.html" href="https://doc.qt.io/qt-6/qcoreapplication.html"><span style="color:#21be2b">QCoreApplication</span></a><span style="color:#ffffff">::</span><span style="color:#ffffff">instance</span><span style="color:#ffffff">());</span>
    <span style="color:#4f9d08">ActionManager</span> <span style="color:#ffffff">*</span><span style="color:#ffffff">actionManager </span><span style="color:#ffffff">=</span><span style="color:#ffffff"> application</span><span style="color:#ffffff">-</span><span style="color:#ffffff">></span><span style="color:#ffffff">actionManager</span><span style="color:#ffffff">();</span>
    <span style="color:#ffff55">const</span> <a data-cke-saved-href="https://doc.qt.io/qt-6/qlist.html" href="https://doc.qt.io/qt-6/qlist.html"><span style="color:#21be2b">QList</span></a><span style="color:#ffffff"><</span><a data-cke-saved-href="https://doc.qt.io/qt-6/qaction.html" href="https://doc.qt.io/qt-6/qaction.html"><span style="color:#21be2b">QAction</span></a> <span style="color:#ffffff">*</span><span style="color:#ffffff">></span><span style="color:#ffffff"> registeredActions </span><span style="color:#ffffff">=</span><span style="color:#ffffff"> actionManager</span><span style="color:#ffffff">-</span><span style="color:#ffffff">></span><span style="color:#ffffff">registeredActions</span><span style="color:#ffffff">();</span>
    <span style="color:#ffff55">for</span> <span style="color:#ffffff">(</span><a data-cke-saved-href="https://doc.qt.io/qt-6/qaction.html" href="https://doc.qt.io/qt-6/qaction.html"><span style="color:#21be2b">QAction</span></a> <span style="color:#ffffff">*</span><span style="color:#ffffff">action </span><span style="color:#ffffff">:</span><span style="color:#ffffff"> registeredActions</span><span style="color:#ffffff">)</span> <span style="color:#ffffff">{</span>
        <a data-cke-saved-href="https://doc.qt.io/qt-6/qstring.html" href="https://doc.qt.io/qt-6/qstring.html"><span style="color:#21be2b">QString</span></a><span style="color:#ffffff"> context </span><span style="color:#ffffff">=</span><span style="color:#ffffff"> actionManager</span><span style="color:#ffffff">-</span><span style="color:#ffffff">></span><span style="color:#ffffff">contextForAction</span><span style="color:#ffffff">(</span><span style="color:#ffffff">action</span><span style="color:#ffffff">);</span>
        <a data-cke-saved-href="https://doc.qt.io/qt-6/qstring.html" href="https://doc.qt.io/qt-6/qstring.html"><span style="color:#21be2b">QString</span></a><span style="color:#ffffff"> category </span><span style="color:#ffffff">=</span><span style="color:#ffffff"> actionManager</span><span style="color:#ffffff">-</span><span style="color:#ffffff">></span><span style="color:#ffffff">categoryForAction</span><span style="color:#ffffff">(</span><span style="color:#ffffff">action</span><span style="color:#ffffff">);</span><span style="color:#ffffff">
        actionsMap</span><span style="color:#ffffff">[</span><span style="color:#ffffff">context</span><span style="color:#ffffff">]</span><span style="color:#ffffff">[</span><span style="color:#ffffff">category</span><span style="color:#ffffff">]</span><span style="color:#ffffff">.</span><span style="color:#ffffff">append</span><span style="color:#ffffff">(</span><span style="color:#ffffff">action</span><span style="color:#ffffff">);</span>
    <span style="color:#ffffff">}</span>

    <a data-cke-saved-href="https://doc.qt.io/qt-6/qaction.html" href="https://doc.qt.io/qt-6/qaction.html"><span style="color:#21be2b">QAction</span></a> <span style="color:#ffffff">*</span><span style="color:#ffffff">nullAction </span><span style="color:#ffffff">=</span> <span style="color:#ffff55">nullptr</span><span style="color:#ffffff">;</span>
    <span style="color:#ffff55">const</span> <a data-cke-saved-href="https://doc.qt.io/qt-6/qstring.html" href="https://doc.qt.io/qt-6/qstring.html"><span style="color:#21be2b">QString</span></a><span style="color:#ffffff"> contextIdPrefix </span><span style="color:#ffffff">=</span> <span style="color:#aaaaaa">"root"</span><span style="color:#ffffff">;</span>
    <span style="color:#55ffff">// Go through each context, one context - many categories each iteration</span>
    <span style="color:#ffff55">for</span> <span style="color:#ffffff">(</span><span style="color:#ffff55">const</span> <span style="color:#ffff55">auto</span> <span style="color:#ffffff">&</span><span style="color:#ffffff">contextLevel </span><span style="color:#ffffff">:</span><span style="color:#ffffff"> actionsMap</span><span style="color:#ffffff">.</span><span style="color:#ffffff">keys</span><span style="color:#ffffff">())</span> <span style="color:#ffffff">{</span>
        <span style="color:#4f9d08">ShortcutEditorModelItem</span> <span style="color:#ffffff">*</span><span style="color:#ffffff">contextLevelItem </span><span style="color:#ffffff">=</span> <span style="color:#ffff55">new</span> <span style="color:#4f9d08">ShortcutEditorModelItem</span><span style="color:#ffffff">({</span><span style="color:#ffffff">contextLevel</span><span style="color:#ffffff">,</span> <a data-cke-saved-href="https://doc.qt.io/qt-6/qvariant.html" href="https://doc.qt.io/qt-6/qvariant.html"><span style="color:#21be2b">QVariant</span></a><span style="color:#ffffff">::</span><span style="color:#ffffff">fromValue</span><span style="color:#ffffff">(</span><span style="color:#ffffff">nullAction</span><span style="color:#ffffff">)}</span><span style="color:#ffffff">,</span><span style="color:#ffffff"> parent</span><span style="color:#ffffff">);</span><span style="color:#ffffff">
        parent</span><span style="color:#ffffff">-</span><span style="color:#ffffff">></span><span style="color:#ffffff">appendChild</span><span style="color:#ffffff">(</span><span style="color:#ffffff">contextLevelItem</span><span style="color:#ffffff">);</span>

        <span style="color:#55ffff">// Go through each category, one category - many actions each iteration</span>
        <span style="color:#ffff55">for</span> <span style="color:#ffffff">(</span><span style="color:#ffff55">const</span> <span style="color:#ffff55">auto</span> <span style="color:#ffffff">&</span><span style="color:#ffffff">categoryLevel </span><span style="color:#ffffff">:</span><span style="color:#ffffff"> actionsMap</span><span style="color:#ffffff">[</span><span style="color:#ffffff">contextLevel</span><span style="color:#ffffff">]</span><span style="color:#ffffff">.</span><span style="color:#ffffff">keys</span><span style="color:#ffffff">())</span> <span style="color:#ffffff">{</span>
            <span style="color:#4f9d08">ShortcutEditorModelItem</span> <span style="color:#ffffff">*</span><span style="color:#ffffff">categoryLevelItem </span><span style="color:#ffffff">=</span> <span style="color:#ffff55">new</span> <span style="color:#4f9d08">ShortcutEditorModelItem</span><span style="color:#ffffff">({</span><span style="color:#ffffff">categoryLevel</span><span style="color:#ffffff">,</span> <a data-cke-saved-href="https://doc.qt.io/qt-6/qvariant.html" href="https://doc.qt.io/qt-6/qvariant.html"><span style="color:#21be2b">QVariant</span></a><span style="color:#ffffff">::</span><span style="color:#ffffff">fromValue</span><span style="color:#ffffff">(</span><span style="color:#ffffff">nullAction</span><span style="color:#ffffff">)}</span><span style="color:#ffffff">,</span><span style="color:#ffffff"> contextLevelItem</span><span style="color:#ffffff">);</span><span style="color:#ffffff">
            contextLevelItem</span><span style="color:#ffffff">-</span><span style="color:#ffffff">></span><span style="color:#ffffff">appendChild</span><span style="color:#ffffff">(</span><span style="color:#ffffff">categoryLevelItem</span><span style="color:#ffffff">);</span>
            <span style="color:#ffff55">for</span> <span style="color:#ffffff">(</span><a data-cke-saved-href="https://doc.qt.io/qt-6/qaction.html" href="https://doc.qt.io/qt-6/qaction.html"><span style="color:#21be2b">QAction</span></a> <span style="color:#ffffff">*</span><span style="color:#ffffff">action </span><span style="color:#ffffff">:</span><span style="color:#ffffff"> actionsMap</span><span style="color:#ffffff">[</span><span style="color:#ffffff">contextLevel</span><span style="color:#ffffff">]</span><span style="color:#ffffff">[</span><span style="color:#ffffff">categoryLevel</span><span style="color:#ffffff">]</span><span style="color:#ffffff">)</span> <span style="color:#ffffff">{</span>
                <a data-cke-saved-href="https://doc.qt.io/qt-6/qstring.html" href="https://doc.qt.io/qt-6/qstring.html"><span style="color:#21be2b">QString</span></a><span style="color:#ffffff"> name </span><span style="color:#ffffff">=</span><span style="color:#ffffff"> action</span><span style="color:#ffffff">-</span><span style="color:#ffffff">></span><span style="color:#ffffff">text</span><span style="color:#ffffff">();</span>
                <span style="color:#ffff55">if</span> <span style="color:#ffffff">(</span><span style="color:#ffffff">name</span><span style="color:#ffffff">.</span><span style="color:#ffffff">isEmpty</span><span style="color:#ffffff">()</span> <span style="color:#ffffff">|</span><span style="color:#ffffff">|</span> <span style="color:#ffffff">!</span><span style="color:#ffffff">action</span><span style="color:#ffffff">)</span>
                    <span style="color:#ffff55">continue</span><span style="color:#ffffff">;</span>

                <span style="color:#4f9d08">ShortcutEditorModelItem</span> <span style="color:#ffffff">*</span><span style="color:#ffffff">actionLevelItem </span><span style="color:#ffffff">=</span> <span style="color:#ffff55">new</span> <span style="color:#4f9d08">ShortcutEditorModelItem</span><span style="color:#ffffff">({</span><span style="color:#ffffff">name</span><span style="color:#ffffff">,</span> <a data-cke-saved-href="https://doc.qt.io/qt-6/qvariant.html" href="https://doc.qt.io/qt-6/qvariant.html"><span style="color:#21be2b">QVariant</span></a><span style="color:#ffffff">::</span><span style="color:#ffffff">fromValue</span><span style="color:#ffffff">(</span><span style="color:#ffff55">reinterpret_cast</span><span style="color:#ffffff"><</span><span style="color:#ffff55">void</span> <span style="color:#ffffff">*</span><span style="color:#ffffff">></span><span style="color:#ffffff">(</span><span style="color:#ffffff">action</span><span style="color:#ffffff">))}</span><span style="color:#ffffff">,</span><span style="color:#ffffff"> categoryLevelItem</span><span style="color:#ffffff">);</span><span style="color:#ffffff">
                categoryLevelItem</span><span style="color:#ffffff">-</span><span style="color:#ffffff">></span><span style="color:#ffffff">appendChild</span><span style="color:#ffffff">(</span><span style="color:#ffffff">actionLevelItem</span><span style="color:#ffffff">);</span>
            <span style="color:#ffffff">}</span>
        <span style="color:#ffffff">}</span>
    <span style="color:#ffffff">}</span>
<span style="color:#ffffff">}</span></span></span></span>

待办事项

<span style="color:#404244"><span style="background-color:#3a4055"><span style="color:#ffffff"><span style="color:#ffff55">bool</span> <span style="color:#4f9d08">ShortcutEditorModel</span><span style="color:#ffffff">::</span><span style="color:#ffffff">setData</span><span style="color:#ffffff">(</span><span style="color:#ffff55">const</span> <a data-cke-saved-href="https://doc.qt.io/qt-6/qmodelindex.html" href="https://doc.qt.io/qt-6/qmodelindex.html"><span style="color:#21be2b">QModelIndex</span></a> <span style="color:#ffffff">&</span><span style="color:#ffffff">index</span><span style="color:#ffffff">,</span> <span style="color:#ffff55">const</span> <a data-cke-saved-href="https://doc.qt.io/qt-6/qvariant.html" href="https://doc.qt.io/qt-6/qvariant.html"><span style="color:#21be2b">QVariant</span></a> <span style="color:#ffffff">&</span><span style="color:#ffffff">value</span><span style="color:#ffffff">,</span> <span style="color:#ffff55">int</span><span style="color:#ffffff"> role</span><span style="color:#ffffff">)</span>
<span style="color:#ffffff">{</span>
    <span style="color:#ffff55">if</span> <span style="color:#ffffff">(</span><span style="color:#ffffff">role </span><span style="color:#ffffff">=</span><span style="color:#ffffff">=</span> <a data-cke-saved-href="https://doc.qt.io/qt-6/qt.html" href="https://doc.qt.io/qt-6/qt.html"><span style="color:#21be2b">Qt</span></a><span style="color:#ffffff">::</span><span style="color:#4f9d08">EditRole</span> <span style="color:#ffffff">&</span><span style="color:#ffffff">&</span><span style="color:#ffffff"> index</span><span style="color:#ffffff">.</span><span style="color:#ffffff">column</span><span style="color:#ffffff">()</span> <span style="color:#ffffff">=</span><span style="color:#ffffff">=</span> <span style="color:#ffff55">static_cast</span><span style="color:#aaaaaa"><</span><span style="color:#aaaaaa">int</span><span style="color:#aaaaaa">></span><span style="color:#ffffff">(</span><span style="color:#4f9d08">Column</span><span style="color:#ffffff">::</span><span style="color:#4f9d08">Shortcut</span><span style="color:#ffffff">))</span> <span style="color:#ffffff">{</span>
        <a data-cke-saved-href="https://doc.qt.io/qt-6/qstring.html" href="https://doc.qt.io/qt-6/qstring.html"><span style="color:#21be2b">QString</span></a><span style="color:#ffffff"> keySequenceString </span><span style="color:#ffffff">=</span><span style="color:#ffffff"> value</span><span style="color:#ffffff">.</span><span style="color:#ffffff">toString</span><span style="color:#ffffff">();</span>
        <span style="color:#4f9d08">ShortcutEditorModelItem</span> <span style="color:#ffffff">*</span><span style="color:#ffffff">item </span><span style="color:#ffffff">=</span> <span style="color:#ffff55">static_cast</span><span style="color:#ffffff"><</span><span style="color:#4f9d08">ShortcutEditorModelItem</span> <span style="color:#ffffff">*</span><span style="color:#ffffff">></span><span style="color:#ffffff">(</span><span style="color:#ffffff">index</span><span style="color:#ffffff">.</span><span style="color:#ffffff">internalPointer</span><span style="color:#ffffff">());</span>
        <a data-cke-saved-href="https://doc.qt.io/qt-6/qaction.html" href="https://doc.qt.io/qt-6/qaction.html"><span style="color:#21be2b">QAction</span></a> <span style="color:#ffffff">*</span><span style="color:#ffffff">itemAction </span><span style="color:#ffffff">=</span><span style="color:#ffffff"> item</span><span style="color:#ffffff">-</span><span style="color:#ffffff">></span><span style="color:#ffffff">action</span><span style="color:#ffffff">();</span>
        <span style="color:#ffff55">if</span> <span style="color:#ffffff">(</span><span style="color:#ffffff">itemAction
            </span><span style="color:#ffffff">&</span><span style="color:#ffffff">&</span><span style="color:#ffffff"> keySequenceString </span><span style="color:#ffffff">=</span><span style="color:#ffffff">=</span><span style="color:#ffffff"> itemAction</span><span style="color:#ffffff">-</span><span style="color:#ffffff">></span><span style="color:#ffffff">shortcut</span><span style="color:#ffffff">()</span><span style="color:#ffffff">.</span><span style="color:#ffffff">toString</span><span style="color:#ffffff">(</span><a data-cke-saved-href="https://doc.qt.io/qt-6/qkeysequence.html" href="https://doc.qt.io/qt-6/qkeysequence.html"><span style="color:#21be2b">QKeySequence</span></a><span style="color:#ffffff">::</span><span style="color:#4f9d08">NativeText</span><span style="color:#ffffff">))</span>
            <span style="color:#ffff55">return</span> <span style="color:#ffff55">true</span><span style="color:#ffffff">;</span><span style="color:#ffffff">

        itemAction</span><span style="color:#ffffff">-</span><span style="color:#ffffff">></span><span style="color:#ffffff">setShortcut</span><span style="color:#ffffff">(</span><span style="color:#ffffff">keySequenceString</span><span style="color:#ffffff">);</span><span style="color:#ffffff">
        Q_EMIT dataChanged</span><span style="color:#ffffff">(</span><span style="color:#ffffff">index</span><span style="color:#ffffff">,</span><span style="color:#ffffff"> index</span><span style="color:#ffffff">);</span>

        <span style="color:#ffff55">if</span> <span style="color:#ffffff">(</span><span style="color:#ffffff">keySequenceString</span><span style="color:#ffffff">.</span><span style="color:#ffffff">isEmpty</span><span style="color:#ffffff">())</span>
            <span style="color:#ffff55">return</span> <span style="color:#ffff55">true</span><span style="color:#ffffff">;</span>
    <span style="color:#ffffff">}</span>

    <span style="color:#ffff55">return</span> <a data-cke-saved-href="https://doc.qt.io/qt-6/qabstractitemmodel.html" href="https://doc.qt.io/qt-6/qabstractitemmodel.html"><span style="color:#21be2b">QAbstractItemModel</span></a><span style="color:#ffffff">::</span><span style="color:#ffffff">setData</span><span style="color:#ffffff">(</span><span style="color:#ffffff">index</span><span style="color:#ffffff">,</span><span style="color:#ffffff"> value</span><span style="color:#ffffff">,</span><span style="color:#ffffff"> role</span><span style="color:#ffffff">);</span>
<span style="color:#ffffff">}</span></span></span></span>

待办事项

在模型中设置数据

我们使用该函数在模型中设置初始数据。此函数检索已注册的操作文本并创建记录数据和整体模型结构的项对象。当然,此功能的工作方式非常特定于此模型。我们提供了以下对其行为的描述,并请读者参考示例代码本身以获取更多信息。setupModelData()

为了确保模型正常工作,只需使用正确的数据和父项创建 ShortcutEditorModelItem 的实例。

欢迎大家加入编程交流群
Qt编程交流群 57634222
C++编程交流群 910854771
编程交流群 241531722

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

亭台六七座

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值