热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Qt如何正确的显示、修改表格(QTableView)的内容

安装Qt时,Qt\Qt5.x.x文件夹下自动安装了example文件夹,其中包含了大量的示例。这里根据Examples\Qt-5.5\widgets\t

安装Qt时,Qt\Qt5.x.x文件夹下自动安装了example文件夹,其中包含了大量的示例。这里根据Examples\Qt-5.5\widgets\tutorials\modelview\5_edit,制作了一个tableview,支持用户通过表格来编辑条目。

设计思想:tableview作为界面,QAbstractTableModel作为存储数据的后端。当界面需要显示条目时,会调用QAbstractTableModel::data()函数。此外,QAbstractTableModel::rowCount()和columnnCount()会返回表格的行数(通常也是条目的个数)和列数。假如用户需要在界面上手动修改数据内容,应重写函数QAbstractTableModel::flags()函数。内容被改动后,函数QAbstractTableModel::setData()会被触发。

代码:

#pragma once
#include class EditModel : public QAbstractTableModel
{Q_OBJECT
public:explicit EditModel(QObject *parent = 0);void vPrint(int);
signals:public slots:protected:int rowCount(const QModelIndex &parent) const;//返回模型的行数int columnCount(const QModelIndex &parent) const;//返回模型的列数QVariant data(const QModelIndex &index, int role) const;//及时将model内容的变化修改到qtableview中bool setData(const QModelIndex &index, const QVariant &value, int role) override;//响应手动修改Qt::ItemFlags flags(const QModelIndex &) const override;//必须有这句,否则无法手动修改模型内容QList> m_lstData;
};

 

#include "EditModel.h"
#include EditModel::EditModel(QObject *parent) : QAbstractTableModel(parent)
{//m_lstData.reserve(1024);reserve1024个元素并不会使qlist::size() = 1024int iLen = 1024;for(int k = 0; k (QString(""), QString("")));}
}int EditModel::rowCount(const QModelIndex &parent) const//返回模型的行数
{return m_lstData.size();
}int EditModel::columnCount(const QModelIndex &parent) const//返回模型的列数
{return 2;
}QVariant EditModel::data(const QModelIndex &index, int role) const//及时将model内容的变化修改到qtableview中
{int iRow = index.row(), iCol = index.column();if(iRow >= 0 && iRow }bool EditModel::setData(const QModelIndex &index, const QVariant &value, int role) //响应手动修改
{if(role == Qt::EditRole){int iRow = index.row(), iCol = index.column();if( iRow >= 0 && iRow }Qt::ItemFlags EditModel::flags(const QModelIndex & index) const //必须有这句,否则无法手动修改模型内容
{return Qt::ItemIsEditable | QAbstractTableModel::flags(index);
}void EditModel::vPrint(int iIndex)
{qDebug()<}

 

#ifndef MAINWINDOW_H
#define MAINWINDOW_H#include
#include
#include "EditModel.h"class MainWindow : public QMainWindow
{Q_OBJECTpublic:MainWindow(QWidget *parent &#61; 0);~MainWindow();EditModel * m_pModel;
protected:void hideEvent(QHideEvent *);
};#endif // MAINWINDOW_H

 

#include "mainwindow.h"
#include MainWindow::MainWindow(QWidget *parent): QMainWindow(parent)
{QTableView * pView &#61; new QTableView(this);m_pModel &#61; new EditModel(this);//指定了父之后&#xff0c;父被删除会自动删除EditModelpView->setModel(m_pModel);setCentralWidget(pView);
}MainWindow::~MainWindow()
{}void MainWindow::hideEvent(QHideEvent *)
{m_pModel->vPrint(0);
}

效果&#xff1a;

为了证明用户在界面写入的内容确实进入了model&#xff0c;这里重写了MainWindow::hideEvent()。当窗口被最小化时&#xff0c;EditModel会打印第0个条目的首元素。从下面的图片可见&#xff0c;表格里输入的rrtg确实打印了出来。

 


推荐阅读
  • 在高并发需求的C++项目中,我们最初选择了JsonCpp进行JSON解析和序列化。然而,在处理大数据量时,JsonCpp频繁抛出异常,尤其是在多线程环境下问题更为突出。通过分析发现,旧版本的JsonCpp存在多线程安全性和性能瓶颈。经过评估,我们最终选择了RapidJSON作为替代方案,并实现了显著的性能提升。 ... [详细]
  • 本文探讨了如何通过预处理器开关选择不同的类实现,并解决在特定情况下遇到的链接器错误。 ... [详细]
  • 本文介绍如何从字符串中移除大写、小写、特殊、数字和非数字字符,并提供了多种编程语言的实现示例。 ... [详细]
  • 深入解析Spring启动过程
    本文详细介绍了Spring框架的启动流程,帮助开发者理解其内部机制。通过具体示例和代码片段,解释了Bean定义、工厂类、读取器以及条件评估等关键概念,使读者能够更全面地掌握Spring的初始化过程。 ... [详细]
  • 深入解析 Android IPC 中的 Messenger 机制
    本文详细介绍了 Android 中基于消息传递的进程间通信(IPC)机制——Messenger。通过实例和源码分析,帮助开发者更好地理解和使用这一高效的通信工具。 ... [详细]
  • 题目描述:给定一个N*M的网格,初始时网格中有k个芯片,每个芯片的位置已知。玩家可以在每一步操作中将所有芯片沿同一方向移动一格。如果芯片到达边界,则保持不动。目标是通过一系列操作,使每个芯片依次访问指定的目标位置。 ... [详细]
  • 本题来自WC2014,题目编号为BZOJ3435、洛谷P3920和UOJ55。该问题描述了一棵不断生长的带权树及其节点上小精灵之间的友谊关系,要求实时计算每次新增节点后树上所有可能的朋友对数。 ... [详细]
  • 本文介绍如何利用栈数据结构在C++中判断字符串中的括号是否匹配。通过顺序栈和链栈两种方式实现,并详细解释了算法的核心思想和具体实现步骤。 ... [详细]
  • 深入解析Java虚拟机(JVM)架构与原理
    本文旨在为读者提供对Java虚拟机(JVM)的全面理解,涵盖其主要组成部分、工作原理及其在不同平台上的实现。通过详细探讨JVM的结构和内部机制,帮助开发者更好地掌握Java编程的核心技术。 ... [详细]
  • Linux环境下C语言实现定时向文件写入当前时间
    本文介绍如何在Linux系统中使用C语言编程,实现在每秒钟向指定文件中写入当前时间戳。通过此示例,读者可以了解基本的文件操作、时间处理以及循环控制。 ... [详细]
  • 在尝试使用C# Windows Forms客户端通过SignalR连接到ASP.NET服务器时,遇到了内部服务器错误(500)。本文将详细探讨问题的原因及解决方案。 ... [详细]
  • InmyapplicationIhaveQGraphicsScenewithpixmapaddedandallisviewedinQGraphicsViewwithsc ... [详细]
  • 历经三十年的开发,Mathematica 已成为技术计算领域的标杆,为全球的技术创新者、教育工作者、学生及其他用户提供了一个领先的计算平台。最新版本 Mathematica 12.3.1 增加了多项核心语言、数学计算、可视化和图形处理的新功能。 ... [详细]
  • CSS高级技巧:动态高亮当前页面导航
    本文介绍了如何使用CSS实现网站导航栏中当前页面的高亮显示,提升用户体验。通过为每个页面的body元素添加特定ID,并结合导航项的类名,可以轻松实现这一功能。 ... [详细]
  • 本文介绍两道有趣的编程问题:一是寻找给定数字n的连续数字序列及其个数,二是模拟一个翻杯子的游戏。同时附带一道智商题供读者思考。 ... [详细]
author-avatar
sjxs198422
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有