公司动态

「Qt Widget中文示例指南」如何实现一个快捷编辑器(一)

📅 2026/7/18 10:01:25
「Qt Widget中文示例指南」如何实现一个快捷编辑器(一)
Qt是目前最先进、最完整的跨平台C开发工具。它不仅完全实现了一次编写所有平台无差别运行更提供了几乎所有开发过程中需要用到的工具。如今Qt已被运用于超过70个行业、数千家企业支持数百万设备及应用。快捷编辑器示例展示了如何创建一个基本的读写层次模型来与Qt的标准视图和QKeySequenceEdit类一起使用。Qt的模型/视图架构为视图提供了一种标准的方式来操作数据源中的信息使用数据的抽象模型来简化和标准化访问数据的方式。快捷编辑器模型将操作表示为项目树并允许视图通过基于索引的系统访问此数据。更一般地说可以使用模型以树结构的形式表示数据方法是允许每个项作为子项表的父项。设计及概念我们用来表示数据结构的数据结构采用由ShortcutEditorModelItem对象构建的树表单每个ShortcutEditorModelItem表示树视图中的一个项并包含两列数据。快捷编辑器结构数据使用ShortcutEditorModelItem对象存储在模型内部这些对象在基于指针的树结构中链接在一起。通常每个ShortcutEditorModelItem都有一个父项并且可以有许多子项。但是树结构中的根项没有父项也不会在模型之外被引用。每个ShortcutEditorModelItem都包含有关其在树结构中的位置的信息它可以返回父项及其行号。有了这些随时可用的信息就可以更容易地实现模型。由于树视图中的每个项通常包含几列数据(在本例中是一个名称和一个快捷方式)因此将这些信息存储在每个项中是很自然的。为简单起见我们将使用一个QVariant对象列表来存储项目中每一列的数据。使用基于指针的树结构意味着当将模型索引传递给视图时我们可以记录索引中相应项的地址(参见QAbstractItemModel::createIndex())并稍后使用QModelIndex::internalPointer()检索它。这使得编写模型更容易并确保引用同一项的所有模型索引具有相同的内部数据指针。有了适当的数据结构我们就可以用最少的额外代码创建树模型为其他组件提供模型索引和数据。ShortcutEditorModelItem类定义ShortcutEditorModelItem类定义如下这个类是一个基本的c类它不继承QObject也不提供信号和插槽。它用于保存qvariables列表其中包含列数据和关于其在树结构中的位置的信息。这些函数提供以下特性appendChildItem()用于在模型首次构造时添加数据在正常使用期间不会使用。child()和childCount()函数允许模型获取任何子项的信息。与项目相关联的列数信息由columnCount()提供每列中的数据可以通过data()函数获得。row()和parent()函数用于获取项的行号和父项。父项和列数据存储在parentItem和itemData私有成员变量中childItems变量包含一个指向该项自身子项的指针列表。ShortcutEditorModel类定义ShortcutEditorModel类定义如下class ShortcutEditorModel : public QAbstractItemModel { Q_OBJECT class ShortcutEditorModelItem { public: explicit ShortcutEditorModelItem(const QListQVariant data, ShortcutEditorModelItem *parentItem nullptr); ~ShortcutEditorModelItem(); void appendChild(ShortcutEditorModelItem *child); ShortcutEditorModelItem *child(int row) const; int childCount() const; int columnCount() const; QVariant data(int column) const; int row() const; ShortcutEditorModelItem *parentItem() const; QAction *action() const; private: QListShortcutEditorModelItem * m_childItems; QListQVariant m_itemData; ShortcutEditorModelItem *m_parentItem; }; public: explicit ShortcutEditorModel(QObject *parent nullptr); ~ShortcutEditorModel() override; QVariant data(const QModelIndex index, int role Qt::DisplayRole) const override; Qt::ItemFlags flags(const QModelIndex index) const override; QVariant headerData(int section, Qt::Orientation orientation, int role Qt::DisplayRole) const override; QModelIndex index(int row, int column, const QModelIndex parent QModelIndex()) const override; QModelIndex parent(const QModelIndex index) const override; int rowCount(const QModelIndex index QModelIndex()) const override; int columnCount(const QModelIndex index QModelIndex()) const override; bool setData(const QModelIndex index, const QVariant value, int role Qt::EditRole) override; void setActions(); private: void setupModelData(ShortcutEditorModelItem *parent); ShortcutEditorModelItem *m_rootItem; };这个类类似于提供读写模型的QAbstractItemModel的大多数其他子类只有构造函数的表单和setupModelData()函数是特定于这个模型的。此外我们还提供了一个析构函数以便在模型被销毁时进行清理。