QAbstractItemDelegate
一、描述
QAbstractItemDelegate 为模型/视图框架中的委托提供接口和通用功能。委托在视图中显示单个项目,并处理模型数据的编辑。
要以自定义方式呈现项目,必须实现paint() 和sizeHint()。QStyledItemDelegate 类为这些函数提供了默认实现,如果不需要自定义渲染,请改为对 QStyledItemDelegate 类进行子类化。
举一个在items中绘制进度条的例子;
创建 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开发学习资料包、技术视频,内容包括(C++语言基础,Qt编程入门,QT信号与槽机制,QT界面开发-图像绘制,QT网络,QT数据库编程,QT项目实战,QT嵌入式开发,Quick模块等等)↓↓↓↓↓↓见下面↓↓文章底部点击莬费领取↓↓
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开发学习资料包、技术视频,内容包括(C++语言基础,Qt编程入门,QT信号与槽机制,QT界面开发-图像绘制,QT网络,QT数据库编程,QT项目实战,QT嵌入式开发,Quick模块等等)↓↓↓↓↓↓见下面↓↓文章底部点击莬费领取↓↓
原文链接:https://blog.csdn.net/kenfan1647/article/details/119567550