QT model

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();
}

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

可能只会写BUG

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值