IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> C++知识库 -> QT QTableView(基于QStandardItemModel用法)操作详解 -> 正文阅读

[C++知识库]QT QTableView(基于QStandardItemModel用法)操作详解

前言

前面详细介绍过QTableWidget的用法,今天想一次性把QTable系列写完,也就是QTabelview的使用,我发现使用QTableWidget如果频繁的clean,然后又set,会很卡,哪怕你只是每次set10个数据,都会有1到2秒的卡顿,所以我又转到了QTabelview的使用,看看是否也是一样,本次使用的model并不是自定义继承QAbstractItemModel,然后实现一些必要的虚函数,如果想这要操作的额可以看我这篇博客QML 中使用 QAbstractListModel 作为 ListView 的 model 实例 2, 所以本次使用了QStandardItemModel作为数据模型来实现了对TableView初始化,以及对应的增删改查功能。

关于QStandardItemModel

QStandardItemModel 是标准的以项数据(item data)为基础的标准数据模型类,通常与 QTableView 组合成 Model/View 结构,实现通用的二维数据的管理功能。

本节介绍 QStandardltemModel 的使用,主要用到以下 3 个类:

  1. QStandardItemModel:基于项数据的标准数据模型,可以处理二维数据。维护一个二维的项数据数组,每个项是一个 QStandardltem 类的变量,用于存储项的数据、字体格式、对齐方式等。
  2. QTableView:二维数据表视图组件,有多个行和多个列,每个基本显示单元是一个单元格,通过 setModel() 函数设置一个 QStandardItemModel 类的数据模型之后,一个单元格显示 QStandardItemModel 数据模型中的一个项。
  3. QItemSelectionModel:一个用于跟踪视图组件的单元格选择状态的类,当在 QTableView 选择某个单元格,或多个单元格时,通过 QItemSelectionModel 可以获得选中的单元格的模型索引,为单元格的选择操作提供方便。

这几个类之间的关系是:QTableView 是界面视图组件,其关联的数据模型是 QStandardItemModel,关联的项选择模型是 QItemSelectionModelQStandardItemModel 的数据管理的基本单元是 QStandardItem

先看效果图:
在这里插入图片描述

上下翻页实例代码讲解

首先新建一个工程,主要功能就是上下翻页,每页显示10条数据,看看每次换页的速度会停留多久!

.h实现代码如下:

#ifndef WIDGET_H
#define WIDGET_H

#include <QWidget>
#include <QStandardItemModel>

QT_BEGIN_NAMESPACE
namespace Ui { class Widget; }
QT_END_NAMESPACE

class Widget : public QWidget
{
    Q_OBJECT

public:
    Widget(QWidget *parent = nullptr);
    ~Widget();

    //每行数据显示
    struct Data
    {
        QString name;  //名称
        QString age;     //年纪
        QString score;  //分数
    };

private slots:
    //上一页
    void on_pushButton_previousPage_clicked();
    //下一页
    void on_pushButton_nextPage_clicked();

private:
    //更新tabelview数据
    void updateTableData();


private:
    Ui::Widget *ui;

    QStandardItemModel * m_standard_data_model; //数据模型

    QList<Data> m_data_list; //装载数据

    int m_cur_page = 0;  //当前页
    int m_max_page_num = 10; //一页最大数量,也就是行数
};
#endif // WIDGET_H

这里定义了数据模型变量 m_standard_data_model, 一页显示的最大数量m_max_page_num以及 当前页变量m_cur_page

.cpp实现代码:

#include "widget.h"
#include "ui_widget.h"
#include <QDebug>
Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
{
    ui->setupUi(this);
    m_standard_data_model= new QStandardItemModel(this);

    /* 设置表格标题行(输入数据为QStringList类型) */
    m_standard_data_model->setHorizontalHeaderLabels(QStringList()<<"序列号"<<"姓名"<<"年龄"<<"分数");

    //不可编辑
    ui->tableView->setEditTriggers(QAbstractItemView::NoEditTriggers);
    //设置model
    ui->tableView->setModel(m_standard_data_model);

    /* 自适应所有列,让它布满空间 */
    ui->tableView->horizontalHeader()->setSectionResizeMode(QHeaderView::Stretch);
    //去掉自动序号列
    ui->tableView->verticalHeader()->setHidden(true);

    for(int i = 0; i < 38; i++)
    {
        Data data;
        data.age = "年龄:"+QString::number(i*2);
        data.name = "姓名"+QString::number(i);
        data.score = QString::number(i+1);

        m_data_list.append(data);
    }


    updateTableData();

}

Widget::~Widget()
{
    delete ui;
}

void Widget::on_pushButton_previousPage_clicked()
{
    if(m_cur_page >= 1)
    {
        m_cur_page--;
        updateTableData();

        ui->pushButton_nextPage->setEnabled(true);
        if(m_cur_page <= 0)
        {
            ui->pushButton_previousPage->setEnabled(false);
        }
    }
    else
    {
        ui->pushButton_previousPage->setEnabled(false);
    }
}


void Widget::on_pushButton_nextPage_clicked()
{
    if(m_cur_page*m_max_page_num < m_data_list.size()){
        m_cur_page++;


        updateTableData();
        ui->pushButton_previousPage->setEnabled(true);
        if(m_cur_page >= m_data_list.size()){
            ui->pushButton_nextPage->setEnabled(false);
        }
    }
    else
    {
        ui->pushButton_nextPage->setEnabled(false);
    }
}

void Widget::updateTableData()
{
    qInfo()<<" m_cur_page = "<<m_cur_page;

    bool isok =  m_standard_data_model->removeRows(0 , m_max_page_num);
    //    for(int i = 0; i < m_max_page_num; i++)
    //    {

    //        m_standard_data_model->removeRow(i);
    //    }

    int row_index = 0;
    qInfo()<<" updateTableData isok = "<< isok;
    for(int i_row = m_cur_page * m_max_page_num; i_row <  (m_cur_page+1) * m_max_page_num; i_row++)
    {
        if(m_data_list.size() > i_row)
        {
            //序列号
            QStandardItem * index_item = new QStandardItem(QString::number(i_row+1));
            //姓名
            QStandardItem * name_item = new QStandardItem(m_data_list.at(i_row).name);
            //年龄
            QStandardItem * age_item = new QStandardItem(m_data_list.at(i_row).age);
            //分数
            QStandardItem * score_item = new QStandardItem(m_data_list.at(i_row).score);

            m_standard_data_model->setItem(row_index, 0, index_item);
            m_standard_data_model->setItem(row_index, 1, name_item);
            m_standard_data_model->setItem(row_index, 2, age_item);
            m_standard_data_model->setItem(row_index, 3, score_item);

            row_index++;
        }
    }
}

经过我的测试发现使用 QTableViewQTableWidget 要流畅太多,所以能使用QTableview就尽量使用吧

  C++知识库 最新文章
【C++】友元、嵌套类、异常、RTTI、类型转换
通讯录的思路与实现(C语言)
C++PrimerPlus 第七章 函数-C++的编程模块(
Problem C: 算法9-9~9-12:平衡二叉树的基本
MSVC C++ UTF-8编程
C++进阶 多态原理
简单string类c++实现
我的年度总结
【C语言】以深厚地基筑伟岸高楼-基础篇(六
c语言常见错误合集
上一篇文章      下一篇文章      查看所有文章
加:2022-05-05 10:59:30  更:2022-05-05 10:59:38 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/23 22:40:36-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码