一、模型/视图结构概述
- 基本原理:
- Qt 的模型/视图(Model/View)架构将数据的存储和显示分离,提高了代码的可维护性和复用性。
- 模型(Model):负责存储和管理数据,提供数据的访问接口,如获取数据、插入数据、修改数据、删除数据等。
- 视图(View):负责显示数据,不关心数据的存储和操作,只根据模型的数据进行显示。
- 代理(Delegate):负责在视图中渲染和编辑数据项,提供了一种机制来定制数据的显示和编辑方式,例如使用自定义的部件进行数据的编辑。
二、QAbstractItemModel 类
- 功能:
- 是所有项模型的抽象基类,定义了项模型必须实现的接口,如
rowCount
、columnCount
、data
、setData
等,用于提供数据的存储和操作接口。 - 可以自定义继承自
QAbstractItemModel
的模型类,以满足不同的数据存储和操作需求。
三、QAbstractItemView 类
- 功能:
- 是所有项视图的抽象基类,提供了显示数据的通用接口,如
setModel
用于关联一个模型,视图会根据模型的数据进行显示和更新。 - 常见的派生类有
QListView
、QTreeView
、QTableView
等,分别用于列表、树状、表格形式的数据显示。
四、QStringListModel 类及示例程序功能实现
- 功能:
- 存储一个字符串列表,方便地用于
QListView
和 QComboBox
等视图的数据显示。
#include <QApplication>
#include <QListView>
#include <QStringListModel>
int main(int argc, char *argv[])
{
QApplication app(argc, argv);
QStringListModel *model = new QStringListModel;
QStringList stringList;
stringList << "Item 1" << "Item 2" << "Item 3";
model->setStringList(stringList);
QListView *listView = new QListView;
listView->setModel(model);
listView->show();
return app.exec();
}
- 代码解释:
- 创建一个
QStringListModel
并添加一些字符串元素。 - 创建一个
QListView
并将 QStringListModel
设置为其模型,QListView
将显示字符串列表中的元素。
五、自定义代理
- 自定义代理功能:
- 允许用户自定义数据在视图中的显示和编辑方式,例如使用自定义的部件进行数据的编辑,或者添加一些特定的显示效果。
六、QStyledItemDelegate 类及设计自定义代理类
- 功能:
- 提供了默认的数据项显示和编辑功能,可作为自定义代理的基类。
#include <QApplication>
#include <QListView>
#include <QStyledItemDelegate>
#include <QPainter>
#include <QStyleOptionViewItem>
class CustomDelegate : public QStyledItemDelegate
{
protected:
void paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const override
{
QStyleOptionViewItem opt = option;
initStyleOption(&opt, index);
painter->save();
painter->setPen(Qt::red);
painter->drawText(opt.rect, Qt::AlignCenter, index.data().toString());
painter->restore();
}
QWidget *createEditor(QWidget *parent, const QStyleOptionViewItem &option, const QModelIndex &index) const override
{
QLineEdit *editor = new QLineEdit(parent);
return editor;
}
void setEditorData(QWidget *editor, const QModelIndex &index) const override
{
QLineEdit *lineEdit = qobject_cast<QLineEdit*>(editor);
if (lineEdit) {
lineEdit->setText(index.data().toString());
}
}
void setModelData(QWidget *editor, QAbstractItemModel *model, const QModelIndex &index) const override
{
QLineEdit *lineEdit = qobject_cast<QLineEdit*>(editor);
if (lineEdit) {
model->setData(index, lineEdit->text());
}
}
void updateEditorGeometry(QWidget *editor, const QStyleOptionViewItem &option, const QModelIndex &index) const override
{
editor->setGeometry(option.rect);
}
};
int main(int argc, char *argv[])
{
QApplication app(argc, argv);
QStringListModel *model = new QStringListModel;
QStringList stringList;
stringList << "Item 1" << "Item 2" << "Item 3";
model->setStringList(stringList);
QListView *listView = new QListView;
listView->setModel(model);
CustomDelegate *delegate = new CustomDelegate;
listView->setItemDelegate(delegate);
listView->show();
return app.exec();
}
- 代码解释:
- 自定义
CustomDelegate
类,继承自 QStyledItemDelegate
。 paint
方法用于自定义数据项的绘制,这里将文本绘制为红色。createEditor
方法创建自定义的编辑部件(这里是 QLineEdit
)。setEditorData
方法将模型数据设置到编辑器中。setModelData
方法将编辑器的数据更新到模型中。updateEditorGeometry
方法设置编辑器的位置和大小。
七、QFileSystemModel 和 QTreeView 类及示例程序功能实现
- 功能:
QFileSystemModel
提供了文件系统的数据模型,可以显示文件和目录。QTreeView
可以用来显示 QFileSystemModel
提供的数据。
#include <QApplication>
#include <QTreeView>
#include <QFileSystemModel>
int main(int argc, char *argv[])
{
QApplication app(argc, argv);
QFileSystemModel *model = new QFileSystemModel;
model->setRootPath(QDir::homePath());
QTreeView *treeView = new QTreeView;
treeView->setModel(model);
treeView->setRootIndex(model->index(QDir::homePath()));
treeView->show();
return app.exec();
}
- 代码解释:
- 创建
QFileSystemModel
并设置根路径为用户的主目录。 - 创建
QTreeView
并将 QFileSystemModel
设置为其模型。 - 将
QTreeView
的根索引设置为用户主目录,使其显示用户主目录下的文件和目录结构。