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

Qt 是目前最先进、最完整的跨平台C++开发工具。它不仅完全实现了一次编写,所有平台无差别运行,更提供了几乎所有开发过程中需要用到的工具。如今,Qt已被运用于超过70个行业、数千家企业,支持数百万设备及应用。

快捷编辑器示例展示了如何创建一个基本的读写层次模型,来与Qt的标准视图和QKeySequenceEdit类一起使用。

点击获取Qt Widget组件下载(Q技术交流:166830288)

Qt技术交流群:166830288      欢迎一起进群讨论

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

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

设计及概念

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

快捷编辑器结构

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

每个ShortcutEditorModelItem都包含有关其在树结构中的位置的信息,它可以返回父项及其行号。有了这些随时可用的信息,就可以更容易地实现模型。

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

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

使用基于指针的树结构意味着,当将模型索引传递给视图时,我们可以记录索引中相应项的地址(参见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 QList<QVariant> &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:
QList<ShortcutEditorModelItem *> m_childItems;
QList<QVariant> 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()函数是特定于这个模型的。此外,我们还提供了一个析构函数,以便在模型被销毁时进行清理。

Qt Widget组件推荐
  • QtitanRibbon - Ribbon UI组件:是一款遵循Microsoft Ribbon UI Paradigm for Qt技术的Ribbon UI组件,QtitanRibbon致力于为Windows、Linux和Mac OS X提供功能完整的Ribbon组件。
  • QtitanChart - Qt类图表组件:是一个C ++库,代表一组控件,这些控件使您可以快速地为应用程序提供漂亮而丰富的图表。
  • QtitanDataGrid - Qt网格组件:提供了一套完整的标准 QTableView 函数和传统组件无法实现的独特功能。使您能够将不同来源的各类数据加载到一个快速、灵活且功能强大的可编辑网格中,支持排序、分组、报告、创建带状列、拖放按钮和许多其他方便的功能。
  • QtitanDocking:允许您像 Visual Studio 一样为您的伟大应用程序配备可停靠面板和可停靠工具栏。黑色、白色、蓝色调色板完全支持 Visual Studio 2019 主题!
  • 22
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值