model
在 Qt 中,模型/视图(Model/View)架构是一种用于分离数据和数据显示的设计模式。
这种架构使得数据的存储和显示可以独立地进行修改和扩展。
Qt 提供了丰富的模型和视图类,用于处理各种数据结构和显示需求。
主要组件
模型(Model):
QAbstractItemModel 所有模型的抽象基类,定义了模型/视图框架的基本接口。
↑
QAbstractListModel 用于列表数据的抽象模型类,继承自 QAbstractItemModel。
QAbstractTableModel 用于表格数据的抽象模型类,继承自 QAbstractItemModel。
QAbstractProxyModel 用于代理模型的抽象基类,继承自 QAbstractItemModel。代理模型用于对源模型进行排序、过滤等操作。
↑
QSortFilterProxyModel 一个具体的代理模型类,用于对源模型进行排序和过滤。
QAbstractItemModel:所有模型的抽象基类。
QStandardItemModel:一个通用的模型,适用于大多数简单的模型/视图应用。
QFileSystemModel:用于表示文件系统的模型。
QSqlQueryModel、QSqlTableModel、QSqlRelationalTableModel:用于数据库的模型。
视图(View):
视图(View)用于显示模型(Model)中的数据。视图类负责将模型的数据呈现给用户,并处理用户的交互操作。Qt 提供了多种视图类,每种视图类都有其特定的用途和显示方式。
QAbstractItemView 所有视图的抽象基类,定义了视图的基本接口。
↑
QListView 用于显示列表数据的视图。
QTableView 用于显示表格数据的视图
QTreeView 用于显示树形数据的视图。
QColumnView 用于显示多列树形数据的视图。
QHeaderView:用于显示表格和树形视图的头部,提供了列标题和行标题的显示功能。
委托(Delegate):
委托(Delegate)用于处理数据的显示和编辑。委托类负责在视图中绘制和编辑项目,并且可以自定义项目的显示和编辑行为。Qt 提供了默认的委托类 QStyledItemDelegate,同时也允许开发者创建自定义的委托类。
QAbstractItemDelegate
↑
QStyledItemDelegate
QItemDelegate
QAbstractItemDelegate:所有委托的抽象基类。
QStyledItemDelegate:默认的委托,用于提供标准的项目编辑器和显示样式。
QItemDelegate:另一个常用的委托类,提供了类似的功能,但有一些细微的差别。
文件显示器
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QMainWindow>
#include <QAbstractItemModel>//提供树形结构模型
#include <QAbstractItemView>//提供对视图的访问
#include <QItemSelectionModel>//提供对视图中选中项的访问
#include <QSplitter>//提供了分隔窗口的功能
#include <QTableView>//提供表格视图
#include <QTreeView>//提供树形视图
#include <QListView>//提供列表视图
#include <QFileSystemModel>//提供文件系统模型
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
MainWindow(QWidget *parent = nullptr);
~MainWindow();
private:
QFileSystemModel *model;
QTreeView *treeView;
QListView *listView;
QTableView *tableView;
private slots:
};
#endif // MAINWINDOW_H
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QMainWindow>
#include <QAbstractItemModel>//提供树形结构模型
#include <QAbstractItemView>//提供对视图的访问
#include <QItemSelectionModel>//提供对视图中选中项的访问
#include <QSplitter>//提供了分隔窗口的功能
#include <QTableView>//提供表格视图
#include <QTreeView>//提供树形视图
#include <QListView>//提供列表视图
#include <QFileSystemModel>//提供文件系统模型
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
MainWindow(QWidget *parent = nullptr);
~MainWindow();
private:
QFileSystemModel *model;
QTreeView *treeView;
QListView *listView;
QTableView *tableView;
private slots:
};
#endif // MAINWINDOW_H
示例2
#ifndef MODEEXTENDED_H
#define MODEEXTENDED_H
#include <QAbstractTableModel>
#include <QMap>
#include <QVector>
#include<QStringList>
class ModeExtended : public QAbstractTableModel
{
Q_OBJECT
public:
ModeExtended( QObject *parent = nullptr);
//覆写父类方法
//rowCount用来返回行数,columnCount用来返回列数
int rowCount(const QModelIndex &parent = QModelIndex()) const override;
int columnCount(const QModelIndex &parent = QModelIndex()) const override;
//data用来返回单元格的数据
QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const override;
//headerData用来返回表头数据
QVariant headerData(int section, Qt::Orientation orientation, int role = Qt::DisplayRole) const override;
// //setData用来设置单元格的数据
// bool setData(const QModelIndex &index, const QVariant &value, int role = Qt::EditRole) override;
//
// //flags用来设置单元格的属性
// Qt::ItemFlags flags(const QModelIndex &index) const override;
//
// //insertRows用来在指定位置插入行
// bool insertRows(int row, int count, const QModelIndex &parent = QModelIndex()) override;
//
// //removeRows用来删除指定行
// bool removeRows(int row, int count, const QModelIndex &parent = QModelIndex()) override;
//
// //sort用来对表格进行排序
// void sort(int column, Qt::SortOrder order = Qt::AscendingOrder) override;
//
// //clear用来清空表格
// void clear();
//
// //设置数据
// void setModelData(QStringList viewlist);
private:
QVector<short> empindex;
QVector<short> empnameindex;
QMap<short, QString> empno;
QMap<short, QString> empname;
QStringList viewlisttltle;//字符串列表
void ModelFunc();//模型函数
};
#endif // MODEEXTENDED_H
#ifndef MODEEXTENDED_H
#define MODEEXTENDED_H
#include <QAbstractTableModel>
#include <QMap>
#include <QVector>
#include<QStringList>
class ModeExtended : public QAbstractTableModel
{
Q_OBJECT
public:
ModeExtended( QObject *parent = nullptr);
//覆写父类方法
//rowCount用来返回行数,columnCount用来返回列数
int rowCount(const QModelIndex &parent = QModelIndex()) const override;
int columnCount(const QModelIndex &parent = QModelIndex()) const override;
//data用来返回单元格的数据
QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const override;
//headerData用来返回表头数据
QVariant headerData(int section, Qt::Orientation orientation, int role = Qt::DisplayRole) const override;
// //setData用来设置单元格的数据
// bool setData(const QModelIndex &index, const QVariant &value, int role = Qt::EditRole) override;
//
// //flags用来设置单元格的属性
// Qt::ItemFlags flags(const QModelIndex &index) const override;
//
// //insertRows用来在指定位置插入行
// bool insertRows(int row, int count, const QModelIndex &parent = QModelIndex()) override;
//
// //removeRows用来删除指定行
// bool removeRows(int row, int count, const QModelIndex &parent = QModelIndex()) override;
//
// //sort用来对表格进行排序
// void sort(int column, Qt::SortOrder order = Qt::AscendingOrder) override;
//
// //clear用来清空表格
// void clear();
//
// //设置数据
// void setModelData(QStringList viewlist);
private:
QVector<short> empindex;
QVector<short> empnameindex;
QMap<short, QString> empno;
QMap<short, QString> empname;
QStringList viewlisttltle;//字符串列表
void ModelFunc();//模型函数
};
#endif // MODEEXTENDED_H
#include "mainwindow.h"
#include <QApplication>
#include "modeextended.h"
#include <QTableView>
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
// MainWindow w;
// w.show();
ModeExtended modeext;
QTableView *view = new QTableView();//创建一个表格视图
view->setModel(&modeext); //设置模型
view->show();
return a.exec();
}