Qt笔记11【QStandardItemModel 类】

一、重要说明:

       (1)QStandardItemModel是存储数据的模型;
       (2) 控件是显示数据的,与用户交互;
       (3)代理是作用在控件和数据模型之间,做控件和模型中的数据的交互,用户修改的数据会经过代理,代理然后将数据存放在数据模型中。用户不能直接操作数据。
       (4)M/V结构实现了界面和数据的分离。     

二、类属性

   QStandardItemModel类是 Qt框架中M/V结构的数据模型之一,它提供了一种通用的数据模型,用于存储和管理自定义数据。QStandardItemModel采用了树型结构来存储数据,其中每一个节点对应一个QStandardItem对象,每个对象都可以存储任何数据类型的数据。
        

三、控件选择      

        该类与 Qt 的视图类(如QListViewQTableView等)结合使用,以显示和操作数据,提供了一系列函数来管理数据,例如添加、删除、查找、修改行或列等...

四、相关函数

函数名称函数原型说明
构造函数

QStandardItemModel(qobject *parent = nullptr)

QStandardItemModel(int rows, int columns, qobject *parent = nullptr)

用于创建模型,并可指定行数和列数
添加一列

appendColumn(const QList<QStandardItem *> &items)

在模型的最后一列后面添加一列,并插入给定的项目列表
添加一行appendRow(const QList<QStandardItem *> &items)
appendRow(QStandardItem *item)
在模型的最后一行后面添加一行,并插入给定的项目或项目列表
清空clear()删除模型中的所有行和列,重置模型为空
查找findItems(const QString &text, Qt::MatchFlags flags = Qt::MatchExactly, int column = 0) const在模型中查找包含给定文本的项目
标头相关horizontalHeaderItem(int column) const返回指定列的水平表头项目
设置表头setHorizontalHeaderItem(int column, QStandardItem *item)设置指定列的水平表头项目
设置表头setHorizontalHeaderLabels(const QStringList &labels)设置水平表头的标签列表
获取行列

item(int row, int column = 0) const

itemFromIndex(const QModelIndex &index) const

获取指定行和列的项目

通过索引获取项目

设置行列setItem(int row, int column, QStandardItem *item)设置指定行和列的项目
删除列takeColumn(int column)删除指定的列,并返回包含该列中所有项目的列表
设置行列setItem(int row, int column, QStandardItem *item)设置指定行和列的项目
删除标题takeHorizontalHeaderItem(int column)删除指定列的水平标题项目,并返回该项目的指针
删除行列takeItem(int row, int column = 0)删除指定行和列的项目,并返回该项目的指针

五、函数使用

a、【与QTableView控件关联显示】

QStandardItemModel model(4, 3);  // 4 行 3 列

    // 设置表头
model.setHorizontalHeaderLabels(QStringList() << "姓名" << "年龄" << "城市");

    // 填充数据
model.setItem(0, 0, new QStandardItem("张三"));
model.setItem(0, 1, new QStandardItem("25"));
model.setItem(0, 2, new QStandardItem("北京"));

model.setItem(1, 0, new QStandardItem("李四"));
model.setItem(1, 1, new QStandardItem("30"));
model.setItem(1, 2, new QStandardItem("上海"));

model.setItem(2, 0, new QStandardItem("王五"));
model.setItem(2, 1, new QStandardItem("28"));
model.setItem(2, 2, new QStandardItem("广州"));

model.setItem(3, 0, new QStandardItem("赵六"));
model.setItem(3, 1, new QStandardItem("32"));
model.setItem(3, 2, new QStandardItem("深圳"));

QTableView view;
view.setModel(&model);  //将数据模型和显示控件相结合起来
view.show();

b、【与QTreeView控件关联显示】

QTreeView *m_model;//创建控件对象
QStringList header;//创建数据模型
header << "姓名" << "性别" << "工号";
m_model->setHorizontalHeaderLabels(header);// 水平方向的表头

    // 加一级节点
    m_model->setItem(0, 0, new QStandardItem("研发部"));
        // 加二级节点
        m_model->item(0,0)->setChild(0, 0, new QStandardItem("系统研发部"));
           // 加三级节点 
            m_model->item(0,0)->child(0,0)->setChild(0,0,new QStandardItem("张飞"));
            m_model->item(0,0)->child(0,0)->setChild(0,1,new QStandardItem("男"));
            m_model->item(0,0)->child(0,0)->setChild(0,2,new QStandardItem("20"));
        // 加二级节点
        m_model->item(0,0)->setChild(1, 0, new QStandardItem("应用研发部"));
           // 加三级节点
            m_model->item(0,0)->child(1,0)->setChild(0,0,new QStandardItem("关羽"));
            m_model->item(0,0)->child(1,0)->setChild(0,1,new QStandardItem("男"));
            m_model->item(0,0)->child(1,0)->setChild(0,2,new QStandardItem("22"));

    // 加一级节点
    m_model->setItem(1, 0, new QStandardItem("市场部"));
        // 加二级节点
        m_model->item(1,0)->setChild(0, 0, new QStandardItem("国内市场部"));
            // 加三级节点
            m_model->item(1,0)->child(0,0)->setChild(0,0,new QStandardItem("黄忠"));
            m_model->item(1,0)->child(0,0)->setChild(0,1,new QStandardItem("男"));
            m_model->item(1,0)->child(0,0)->setChild(0,2,new QStandardItem("40"));
         // 加二级节点
        m_model->item(1,0)->setChild(1, 0, new QStandardItem("国际市场部"));
             // 加三级节点
            m_model->item(1,0)->child(1,0)->setChild(0,0,new QStandardItem("孙权"));
            m_model->item(1,0)->child(1,0)->setChild(0,1,new QStandardItem("男"));
            m_model->item(1,0)->child(1,0)->setChild(0,2,new QStandardItem("25"));
  
    ui->m_tree->setModel(m_model); // 模型和视图连接    
    ui->m_tree->expandAll();// 展开所有的节点
   // 让表头自适应列宽
    ui->m_tree->header()->setSectionResizeMode(QHeaderView::ResizeToContents); 

c、【动态加行】

 // 设置表头
model.setHorizontalHeaderLabels(QStringList() << "课程" << "分数");

// 动态添加行
QStandardItem *item1 = new QStandardItem("数学");
QStandardItem *item2 = new QStandardItem("90");
model.appendRow(QList<QStandardItem*>() << item1 << item2);

QStandardItem *item3 = new QStandardItem("英语");
QStandardItem *item4 = new QStandardItem("85");
model.appendRow(QList<QStandardItem*>() << item3 << item4);

QTableView view;
view.setModel(&model);
view.show();

d、【查找和修改数据】

 QStandardItemModel model(3, 2);
    model.setHorizontalHeaderLabels(QStringList() << "水果" << "数量");

    model.setItem(0, 0, new QStandardItem("苹果"));
    model.setItem(0, 1, new QStandardItem("10"));

    model.setItem(1, 0, new QStandardItem("香蕉"));
    model.setItem(1, 1, new QStandardItem("15"));

    model.setItem(2, 0, new QStandardItem("橙子"));
    model.setItem(2, 1, new QStandardItem("20"));

    // 查找并修改数据
    QList<QStandardItem*> items = model.findItems("香蕉");
    if (!items.isEmpty()) {
        items.first()->setData("20", Qt::EditRole);
    }

QTableView view;
view.setModel(&model);
view.show();

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值