天天看点

Qt模型视图框架:QAbstractItemDelegate、QFileSystemModel

作者:QT教程

QAbstractItemDelegate

一、描述

QAbstractItemDelegate 为模型/视图框架中的委托提供接口和通用功能。委托在视图中显示单个项目,并处理模型数据的编辑。

要以自定义方式呈现项目,必须实现paint() 和sizeHint()。QStyledItemDelegate 类为这些函数提供了默认实现,如果不需要自定义渲染,请改为对 QStyledItemDelegate 类进行子类化。

举一个在items中绘制进度条的例子;

Qt模型视图框架:QAbstractItemDelegate、QFileSystemModel

创建 WidgetDelegate 类,它继承自 QStyledItemDelegate。在paint()函数中进行绘图:

void WidgetDelegate::paint(QPainter *painter, const QStyleOptionViewItem &option,
const QModelIndex &index) const
{
if (index.column() == 1) {
int progress = index.data().toInt();

QStyleOptionProgressBar progressBarOption;
progressBarOption.rect = option.rect;
progressBarOption.minimum = 0;
progressBarOption.maximum = 100;
progressBarOption.progress = progress;
progressBarOption.text = QString::number(progress) + "%";
progressBarOption.textVisible = true;

QApplication::style()->drawControl(QStyle::CE_ProgressBar, &progressBarOption, painter);
} else
QStyledItemDelegate::paint(painter, option, index);
}           

要提供自定义编辑,可以使用两种方法:

第一种方法是创建一个编辑器小部件并将其直接显示在项目顶部。 必须重新实现 createEditor() 以提供一个编辑器小部件,重新实现 setEditorData() 以使用模型中的数据填充编辑器,并重新实现 setModelData() 以便委托可以使用来自编辑器的数据更新模型。

第二种方法是通过重新实现 editorEvent() 直接处理用户事件。

二、类型成员

1、enum QAbstractItemDelegate::EndEditHint:此枚举描述了委托可以给模型和视图组件的不同提示,以优化模型中编辑数据的体验。

  • NoHint:没有建议执行的操作。
  • 这些提示让委托影响视图的行为:
  • EditNextItem:视图应该使用委托在视图中的下一个项目上打开编辑器。
  • EditPreviousItem:视图应该使用委托来打开视图中上一项的编辑器。
  • 请注意,自定义视图可能会以不同方式解释 上一个项目 和 下一个项目 的概念。
  • 当使用模型缓存数据时,以下提示最有用:
  • SubmitModelCache:如果模型缓存数据,它应该将缓存的数据写出到底层数据存储。
  • RevertModelCache:如果模型缓存数据,它应该丢弃缓存的数据并用来自底层数据存储的数据替换它。

三、成员函数

3.1、信号

1、void closeEditor(QWidget *editor, QAbstractItemDelegate::EndEditHint hint = NoHint)

当用户使用指定的编辑器完成对项目的编辑时,会发出此信号。

NoHint为委托提供了一种方法,可以在编辑完成后影响模型和视图的行为。它向这些组件指示接下来应该执行什么操作,以便为用户提供舒适的编辑体验。 例如,如果指定了 EditNextItem,则视图应使用委托在模型中的下一项上打开编辑器。

2、void commitData(QWidget *editor)

当编辑器小部件完成数据编辑并希望将其写回模型时,必须发出此信号。

3、void sizeHintChanged(const QModelIndex &index)

当 index 的 sizeHint() 改变时,必须发出这个信号。视图会根据需要自动连接到此信号和重新布局项目。

3.2、函数

1、QWidget * createEditor(QWidget *parent, const QStyleOptionViewItem &option, const QModelIndex &index)

返回用于编辑具有给定索引的数据项的编辑器。

索引包含有关正在使用的模型的信息。编辑器的父小部件由 parent 指定,项目选项由 option 指定。

如果想要自定义编辑,则需要重新实现此功能。(要设置样式表必须在parent上设置)

返回的编辑器小部件 focusPolicy() 应该有 Qt::StrongFocus;否则小部件接收到的 MouseEvents 将传播到视图。

除非编辑器绘制自己的背景(例如,使用 setAutoFillBackground()),否则视图的背景会发光。

2、void destroyEditor(QWidget *editor, const QModelIndex &index)

当编辑器不再需要编辑具有给定索引的数据项并且应该销毁时调用。默认行为是在编辑器上调用 deleteLater()。 可以通过重新实现此函数来避免删除或其他自定义操作。

3、bool editorEvent(QEvent *event, QAbstractItemModel *model, const QStyleOptionViewItem &option, const QModelIndex &index)

开始编辑项目时,会使用触发编辑的事件、模型、项目索引以及用于渲染项目的选项调用此函数。

即使鼠标事件没有开始编辑项目,鼠标事件也会发送到 editorEvent()。例如,如果希望在项目上按下鼠标右键时打开上下文菜单,这会很有用。

基本实现返回 false(表明它尚未处理该事件)。

4、bool helpEvent(QHelpEvent *event, QAbstractItemView *view, const QStyleOptionViewItem &option, const QModelIndex &index)

每当发生帮助事件时,都会使用事件视图选项和与发生事件的项目对应的索引调用此函数。

5、void paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index)

如果想提供自定义渲染,则必须重新实现这个纯虚函数。 使用painter 和style 选项来呈现由项目索引指定的项目。

如果重新实现了此函数它,还必须实现 sizeHint()。

6、void setEditorData(QWidget *editor, const QModelIndex &index)

将给定编辑器的内容设置为给定索引处项目的数据。索引包含有关正在使用的模型的信息。

7、void setModelData(QWidget *editor, QAbstractItemModel *model, const QModelIndex &index)

将模型中给定索引处的项目数据设置为给定编辑器的内容。

8、QSize sizeHint(const QStyleOptionViewItem &option, const QModelIndex &index)

大小提示。

9、void updateEditorGeometry(QWidget *editor, const QStyleOptionViewItem &option, const QModelIndex &index)

根据选项中指定的矩形,为具有给定索引的项目更新编辑器的几何形状。

【领QT开发教程学习资料,点击下方链接莬费领取↓↓,先码住不迷路~】

点击这里:「链接」

QFileSystemModel

一、描述

此类提供对本地文件系统的访问,提供重命名和删除文件和目录以及创建新目录的功能。在最简单的情况下,它可以与小部件一起使用,作为浏览器或过滤器的一部分。

QFileSystemModel 可以使用 QAbstractItemModel 提供的标准接口进行访问,但它也提供了一些特定于目录模型的便利功能。

注意:QFileSystemModel 需要一个 QApplication 的实例。

默认用法

QFileSystemModel *model = new QFileSystemModel;
model->setRootPath(QDir::currentPath());

QTreeView tree;
tree.setModel(model);
tree.setRootIndex(model->index(QDir::currentPath()));
tree.show();           

缓存和性能

在调用 setRootPath() 之前,QFileSystemModel 不会获取任何文件或目录。

QFileSystemModel 使用一个单独的线程来查询文件和目录以便于填充模型数据,因此它不会在查询文件系统时导致主线程挂起。

QFileSystemModel 保存包含文件信息的缓存。缓存使用 QFileSystemWatcher 自动保持最新。

二、类型成员

1、enum QFileSystemModel::Option:

  • DontWatchForChanges:不要向路径添加文件观察者。当将模型用于行编辑完成等简单任务时,这会减少开销。
  • DontResolveSymlinks:不解析文件系统模型中的符号链接。
  • DontUseCustomDirectoryIcons:始终使用默认目录图标。一些平台允许用户设置不同的图标。自定义图标会对网络或可移动驱动器的性能产生重大影响。

2、enum QFileSystemModel::Roles

  • FileIconRole:Qt::DecorationRole
  • FilePathRole:Qt::UserRole + 1
  • FileNameRole:Qt::UserRole + 2
  • FilePermissions:Qt::UserRole + 3

三、属性成员

1、nameFilterDisables : bool

未通过名称过滤器的文件是隐藏还是禁用,默认为 true。

2、options : Options

此属性包含影响模型的各种选项。默认情况下,禁用所有选项。

3、readOnly : bool

此属性保存目录模型是否允许写入文件系统。默认为 true。

如果此属性设置为 false,则目录模型将允许重命名、复制和删除文件和目录。

4、resolveSymlinks : bool

此属性保存目录模型是否应解析符号链接。默认为 true。

四、成员函数

4.1、信号

1、[signal] void directoryLoaded(const QString &path)

当查询文件和目录的线程完成加载路径时发出此信号。

2、[signal] void fileRenamed(const QString &path, const QString &oldName, const QString &newName)

每当具有 oldName 的文件成功重命名为 newName 时,就会发出此信号。 该文件位于目录path中。

3、[signal] void rootPathChanged(const QString &newPath)

每当根路径更改为 newPath 时,就会发出此信号。

4.2、函数

1、QIcon fileIcon(const QModelIndex &index)

  • QFileInfo fileInfo(const QModelIndex &index)
  • QString fileName(const QModelIndex &index)
  • QString filePath(const QModelIndex &index)

返回存储在模型中给定索引下的项目的图标、QFileInfo、文件名、路径。

2、 QAbstractFileIconProvider * iconProvider() / void setIconProvider(QAbstractFileIconProvider *provider)

返回此目录模型的文件图标提供程序。

3、QModelIndex index(const QString &path, int column = 0)

返回给定路径和列的模型项索引。

4、bool isDir(const QModelIndex &index)

如果模型项索引表示目录,则返回 true, 否则返回false。

5、QDateTime lastModified(const QModelIndex &index)

返回上次修改索引的日期和时间。

6、QModelIndex mkdir(const QModelIndex &parent, const QString &name)

使用父模型索引中的 name 创建一个目录。

7、QVariant myComputer(int role = Qt::DisplayRole)

返回在给定角色下为项目“我的电脑”存储的数据。

8、bool remove(const QModelIndex &index)

从文件系统模型中删除模型项索引并从文件系统中删除相应的文件,如果成功则返回true。 如果无法删除该项目,则返回 false。

警告:该函数从文件系统中删除文件; 它不会将它们移动到可以恢复的位置。

9、bool rmdir(const QModelIndex &index)

删除文件系统模型中模型项索引对应的目录,并从文件系统中删除对应的目录,成功则返回true。 如果无法删除目录,则返回 false。

警告:该函数从文件系统中删除目录; 它不会将它们移动到可以恢复的位置。

10、QDir rootDirectory()

当前设置的目录。

11、QString rootPath()

当前设置的根路径。

12、void setFilter(QDir::Filters filters)

设置模型的过滤器。请注意,设置的过滤器应始终包含 QDir::AllDirs 枚举值,否则 QFileSystemModel 将无法读取目录结构。

13、void setNameFilters(const QStringList &filters)

设置名称过滤器以应用于现有文件。

14、void setOption(QFileSystemModel::Option option, bool on = true)

如果 on 为true,则设置要启用的给定选项; 否则,清除给定的选项。

15、QModelIndex setRootPath(const QString &newPath)

设置观察的目录为 newPath。 对该目录中文件和目录的任何更改都将反映在模型中。

如果路径发生更改,将发出 rootPathChanged() 信号。

16、qint64 size(const QModelIndex &index)

返回索引的字节大小。 如果文件不存在,则返回 0。

17、bool testOption(QFileSystemModel::Option option)

如果启用了给定的选项,则返回 true,否则返回 false。

18、QString type(const QModelIndex &index)

返回文件索引的类型,例如“目录”或“JPEG 文件”("Directory" or "JPEG file")。

【领QT开发教程学习资料,点击下方链接莬费领取↓↓,先码住不迷路~】

点击这里:「链接」

原文链接:https://blog.csdn.net/kenfan1647/article/details/119567550

继续阅读