QTableView详细使用说明

article/2025/10/23 13:17:17

QTableView详细使用说明

  • 创建QTableView
  • 表格标题
    • 设置表格的标题
    • 获取表格的标题
  • 数据操作
    • 插入数据
    • 删除数据
  • 属性设置
    • 设置表格的对齐方式
    • 设置表格的宽高
    • 设置表格的线属性
  • 自定义菜单
    • eventFilter方法
      • 重载eventFilter()
      • 启用事件监听
      • 实现事件过滤函数
    • 设置菜单属性方法
      • 设置属性
      • 关联信号槽

创建QTableView

QTableView是一种View/Model模式在创建QTableView表格的时,除了创建QTableView对象还需要创建对应的Model对象,Model对象负责表格中的数据单元添加、单元格删除和设置表格标题等操作,一般常见的就是QStandardItemModel模型。

使用时需要包含#include <QTableView>#include <QStandardItemModel>,创建一个QTableView对象和QStandardItemModel并使用QTableViewsetModel()函数将视图和模型对象进行绑定。下面以继承QTableView为示例,代码如下所示:

// .h
#include <QTableView>
#include <QStandardItemModel>class DBTableView: public QTableView
{
public:explicit DBTableView(QWidget * _parent_widget = nullptr);~DBTableView() override;private:QStandardItemModel*                             db_table_model_;
};// .cpp
#include "db_table_view.h"DBTableView::DBTableView(QWidget *_parent_widget): QTableView(_parent_widget)
{db_table_model_ = new QStandardItemModel();setModel(db_table_model_);
}DBTableView::~DBTableView()
{}

表格标题

设置表格的标题

表格最重要的就是标题对于一个表格控件而言标题分为水平标题垂直标题,可以使用model对象提供的setHorizontalHeaderLabels()函数和setVerticalHeaderLabels()函数进行表格标题的设置,前者是对水平标题的设置而后者是对垂直标题的设置,示例代码和效果如下所示:

DBTableView::DBTableView(QWidget *_parent_widget): QTableView(_parent_widget)
{// ......QStringList table_h_headers;table_h_headers << "设施ID" << "设施名称" << "设施等级" << "人员配置"<< "数据采集日期";db_table_model_->setHorizontalHeaderLabels(table_h_headers);QStringList table_v_headers;table_v_headers << "测试1" << "测试2" << "测试3" << "测试4"<< "测试5";db_table_model_->setVerticalHeaderLabels(table_v_headers);
}

表格标题设置效果

表格控件上的所有单元格都是item对象表格标题也不例外,因此可以单独创建item对象然后通过modelsetHorizontalHeaderItem()函数和setVerticalHeaderItem()函数依次对表格进行的标题进行设置,示例代码如下:

DBTableView::DBTableView(QWidget *_parent_widget): QTableView(_parent_widget)
{// ......QStringList table_h_headers;table_h_headers << "设施ID" << "设施名称" << "设施等级" << "人员配置"<< "数据采集日期";for (int index = 0; index < table_h_headers.count(); ++index) {QStandardItem * header_item = new QStandardItem(table_h_headers[index]);db_table_model_->setHorizontalHeaderItem(index, header_item);}
}

这种做法适用于对表格标题需要添加一些数据的时候,例如,当前的模型描述的数据库中的数据表,标题的显示文字可以写成中文,然后将其对应的数据库字段作为附加信息通过setData()函数写道对象中,示例代码如下:

#include "db_table_view.h"#define DATABASE_FIELD_CODE         Qt::UserRole + 100DBTableView::DBTableView(QWidget *_parent_widget): QTableView(_parent_widget)
{// ......QStringList table_h_headers;table_h_headers << "设施ID" << "设施名称" << "设施等级" << "人员配置"<< "数据采集日期";QStringList table_h_fields;table_h_fields << "id" << "name" << "level" << "config"<< "date";for (int index = 0; index < table_h_headers.count(); ++index) {QStandardItem * header_item = new QStandardItem(table_h_headers[index]);header_item->setData(table_h_fields[index], DATABASE_FIELD_CODE);db_table_model_->setHorizontalHeaderItem(index, header_item);}
}

获取表格的标题

设置表格标题后就是获取标题内容,可以通过modelcolumnCount()函数获取数量,配合modelheaderData()函数获取当前列的文字内容,示例代码如下:

DBTableView::DBTableView(QWidget *_parent_widget): QTableView(_parent_widget)
{// ......QStringList table_h_headers;table_h_headers << "设施ID" << "设施名称" << "设施等级" << "人员配置"<< "数据采集日期";db_table_model_->setHorizontalHeaderLabels(table_h_headers);for (int index = 0; index < db_table_model_->columnCount(); ++index) {qInfo() << db_table_model_->headerData(index, Qt::Horizontal, Qt::DisplayRole).toString();}
}

headerData()的第一个参数是列的索引号,第二个参数是获取水平方向还是垂直方向的表头,第三个参数是模型数据编号,该编号与setData()函数在设置时的一致,而这里使用的Qt::DisplayRole是内置的一个编号,用于获取显示的文字内容。

数据操作

插入数据

设置好标题后就可以对表格进行添加数据了,可以使用modelsetItem()函数和appendRow()函数,其中setItem()函数需要指定设置的行和列,而appendRow()函数可以先将一行item的对象添加一个list中然后一次性插入,示例代码如下:

DBTableView::DBTableView(QWidget *_parent_widget): QTableView(_parent_widget)
{// ......db_table_model_->setItem(0, 0, new QStandardItem("1"));db_table_model_->setItem(0, 1, new QStandardItem("2"));db_table_model_->setItem(0, 2, new QStandardItem("3"));db_table_model_->setItem(0, 3,new QStandardItem("4"));db_table_model_->setItem(0, 4,new QStandardItem("5"));QList<QStandardItem*> add_items;for (int index = 0; index < table_h_headers.count(); ++index) {add_items << new QStandardItem(QString::number(index));}db_table_model_->appendRow(add_items);
}

删除数据

删除数据时同样也是依赖model对象,model对象提供了一个clear()函数,该函数可以一次将表格内容和表格标题都删掉,如果只是想将表格内容清空则可以使用modelrowCount()函数配合modelremoveRows()函数完成,示例代码如下:

DBTableView::DBTableView(QWidget *_parent_widget): QTableView(_parent_widget)
{// ......db_table_model_->removeRows(0, db_table_model_->rowCount());
}

删除某一列数据可以使用modelremoveColumn()函数,示例如下:

DBTableView::DBTableView(QWidget *_parent_widget): QTableView(_parent_widget)
{// ......db_table_model_->removeColumn(0);
}

属性设置

对于表格而言可以对其样式进行调整,常见的设置如下:

设置表格的对齐方式

horizontalHeader()->setDefaultAlignment(Qt::AlignLeft);
verticalHeader()->setDefaultAlignment(Qt::AlignBottom);

设置表格的宽高

// 固定表格宽度不可扩展,不可手动调整宽度
horizontalHeader()->setSectionResizeMode(QHeaderView::Fixed);
// 表格宽度随内容自动扩展
horizontalHeader()->setSectionResizeMode(QHeaderView::ResizeToContents);
// 表格宽度自动根据UI进行计算,不可手动调整宽度
horizontalHeader()->setSectionResizeMode(QHeaderView::Stretch);// 固定表格高度不可扩展,不可手动调整高度
verticalHeader()->setSectionResizeMode(QHeaderView::Fixed);
// 表格高度随内容自动扩展
verticalHeader()->setSectionResizeMode(QHeaderView::ResizeToContents);
// 表格高度自动根据UI进行计算,不可手动调整高度
verticalHeader()->setSectionResizeMode(QHeaderView::Stretch);

设置表格的线属性

// 隐藏网格线
setShowGrid(false);
// 显示网格线
setShowGrid(true);
// 线的样式
setGridStyle(Qt::DotLine);

自定义菜单

eventFilter方法

重载eventFilter()

对于表格控件常见的操作就是弹出菜单,当鼠标点击控件时会触发一个QEvent::ContextMenu类型的事件,通过重载eventFilter()事件过滤器函数,并捕获该类型事件来实现菜单的弹出,具体步骤如下:

// .h
// ......
#include <QEvent>
#include <QMenu>class DBTableView: public QTableView
{Q_OBJECT// ......
protected:bool eventFilter(QObject *object, QEvent *event) override;
};

启用事件监听

// .cpp
DBTableView::DBTableView(QWidget *_parent_widget): QTableView(_parent_widget)
{// ......installEventFilter(this);}

实现事件过滤函数

bool DBTableView::eventFilter(QObject *object, QEvent *event) {if(object == this  &&  event->type() == QEvent::ContextMenu) {if(currentIndex().isValid()) {QMenu * menu = new QMenu();menu->addAction("添加数据");menu->addAction("删除数据");QAction * action = menu->exec(cursor().pos());    // 弹出菜单if (action->text().compare("删除数据") == 0) {db_table_model_->removeRow(currentIndex().row());}}}return QAbstractItemView::eventFilter(object, event);
}

效果如下:

自定义菜单实现

设置菜单属性方法

除了直接监听eventFilter之外还有一个简单一些的方式调用QTableView的setContextMenuPolicy()函数,示例代码如下:

设置属性

void TestTable::initUI() {QTableView * table_view = new QTableView();table_view->setContextMenuPolicy(Qt::CustomContextMenu);
}

关联信号槽

在创建完QTableView对象后设置使用自定义菜单策略,然后进行信号槽关联,示例代码如下:

void TestTable::tableViewMenu(const QPoint & _pos) {// 相应数据处理
}void TestTable::initUI() {// ......connect(table_view, &QTableView::customContextMenuRequested, this, &TestTabel::tableViewMenu);
}

http://chatgpt.dhexx.cn/article/043ihNri.shtml

相关文章

web前端新手面试指南:自我介绍

面试时注意&#xff1a;自我介绍不能太长&#xff0c;也不能过短&#xff0c;3分钟左右最合适&#xff0c;尤其做为web前端技术方面的面试&#xff0c;更加要说到点上&#xff0c;我依次从学习方面、项目实践、未来规划这三个方面写下web前端面试的自我介绍。 您好&#xff0c;…

Web前端面试自我介绍对话技巧注意事项

大家在学会了web前端技术后&#xff0c;当然是要准备找一个适合自己的web前端工作了&#xff0c;那么面试环节是必不可少的&#xff0c;有一个良好的自我介绍表述&#xff0c;在HR心中也能加分不少&#xff0c;接下来小编就为大家介绍一下Web前端面试自我介绍对话技巧注意事项。…

前端面试自我介绍的技巧都有哪些?

前端面试自我介绍的技巧都有哪些? 在前端面试自我介绍的时候&#xff0c;可能会遇到两种情况&#xff1a;允许主动和不允许主动&#xff01; 允许主动的情况下&#xff0c;前端程序员应该详细的介绍自己技能树&#xff0c;结合工作经历&#xff0c;展示给面试官自己对项目和…

JVM coredump

JVM crash分析 Java程序运行的时候&#xff0c;遇到了coredump的现象。最后定位到时JIT导致的bug。 http://www.oracle.com/technetwork/java/javase/crashes-137240.html#gbyzu 这里记录下JVMcrash产生的文件怎么去定位问题&#xff0c;但是一般不会遇到crash&#xff0c;h…

coredump 使用总结

1. core dump简介&#xff1a; A core dump is the recorded state of the working memory of a computer program at a specific time, generally when the program has terminated abnormally (crashed). In practice, other key pieces of program state are usually dumped…

【linux】coredump问题排查

序言 记录coredump问题的一些定位技巧 1. coredump简介 coredump称为核心转储&#xff0c;就是在进程异常时的一个快照&#xff0c;保存了异常时的内存、寄存器、堆栈等数据当进程接收到某些 信号 而导致异常退出时&#xff0c;就会生成 coredump 文件core文件是ELF文件格式…

Core Dump核心转储

核心转储&#xff08;core dump&#xff09;&#xff0c;在汉语中有时戏称为吐核&#xff0c;是操作系统在进程收到某些信号而终止运行时&#xff0c;将此时进程地址空间的内容以及有关进程状态的其他信息写出的一个磁盘文件。这种信息往往用于调试。 概述 编辑 在UNIX系统中…

coredump文件的生成以及如何调试coredump文件?

生成coredump文件的相关配置 1. 首先通过 ulimit -a 命令&#xff0c;查看是否允许coredump文件生成; 如下图所示&#xff0c;core文件大小限制为0&#xff0c;即&#xff1a;不允许core文件生成 2. 使用 ulimit -c [kbytes] 命令更改core文件大小的限制 或者 通过 ulimit -c…

android生成coredump,详解coredump--全面

From: http://blog.csdn.net/tenfyguo/article/details/8159176 一,什么是coredump 我们经常听到大家说到程序core掉了,需要定位解决,这里说的大部分是指对应程序由于各种异常或者bug导致在运行过程中异常退出或者中止,并且在满足一定条件下(这里为什么说需要满足一定的条…

coredump文件是如何生成的

目录 一、coredump 文件生成过程 二、coredump文件生成原理 1. 信号处理 do_signal() 2. 生成 coredump 文件 三、生产环境应该打开 coredump 功能吗&#xff1f; 人都会犯错&#xff0c;所以在编写程序时难免会出现 BUG。 有些 BUG 是业务逻辑上的错误导致的&#xff0c…

Coredump 详解

引言 当程序运行的过程中异常终止或崩溃&#xff0c;操作系统会将程序当时的内存状态记录下来&#xff0c;保存在一个文件中&#xff08;core文件&#xff09;&#xff0c;这种行为就叫做 Core Dump 或者叫做 ‘核心转储’&#xff0c;利用 coredump 可以帮助我们快速定位程序…

CoreDump追踪

当程序运行的过程中异常终止或崩溃&#xff0c;操作系统会将程序当时的内存状态记录下来&#xff0c;保存在一个文件中&#xff0c;这种行为就叫做Core Dump&#xff08;中文有的翻译成“核心转储”)。我们可以认为 core dump是“内存快照”&#xff0c;但实际上&#xff0c;除…

coredump详解

原文地址&#xff1a;https://blog.51cto.com/u_15471709/4868198 一&#xff0c;什么是coredump 我们经常听到大家说到程序core掉了&#xff0c;需要定位解决&#xff0c;这里说的大部分是指对应程序由于各种异常或者bug导致在运行过程中异常退出或者中止&#xff0c;并且在满…

linux之fping命令

fping检测主机是否存在,fping命令 fping类似于ping&#xff0c;但比ping强大。与ping要等待某一主机连接超时或发回反馈信息不同&#xff0c;fping给一个主机发送完数据包后&#xff0c;马上给下一个主机发送数据包&#xff0c;实现多主机同时ping&#xff0c;fping还可以在命令…

linux fping参数,linux下,fping命令与ping命令解析

ping Linux系统的ping命令是常用的网络命令&#xff0c;它通常用来测试与目标主机的连通性。 1.命令格式&#xff1a; ping [参数] [主机名或IP地址] 2.命令功能&#xff1a; ping命令用于&#xff1a;确定网络和各外部主机的状态&#xff1b;跟踪和隔离硬件和软件问题&#xf…

php fping,【Linux 命令】fping ping 包间隔时间详解

服务器间检查会用到fping的命令,期间遇到了一个问题,需要将ping包间的间隔时间设置为100毫秒,查看fping -h看下,找到了-i和-p两个参数: 看到这两个参数,我当时的表情是这样的: 看不懂,那就测吧: 先来-i: 间隔1s,没有生效.! 再试试-p OK,这个生效了,但-i 和-p的区别是…

fping使用

【-4】-ipv4仅PING IPv4地址 【-6】-ipv6仅PING IPv6地址 【-b】 指定数据&#xff0c;以字节发送&#xff08;默认值&#xff1a;56&#xff09; 【-c】指定发送的数量 【-f】读取一个文件里面的ip 【-g】扫描一个c段 【--ttl】设置ttl值 当这是为ttl1时&#xff0c;未检测到1…

linux yum fping,ping fping

通过ping来监测对端网络状态 ping fpinf在windows和linux上的参数是不同的&#xff0c;返回的结果也是不同的 在网络连通性监测方面用的比较多&#xff0c;在py go中调用命令&#xff0c;对返回的结果使用正则来在文本中挑出所需要的数据信息 windows中的ping参数 fping fping只…

【kali-2021.1】FPING—参数中文版(上)

目录 FPINGFPING是什么命令格式Fping用法选项介绍中文版示例1.不带选项2.设置数据包大小&#xff08;1&#xff09;默认情况下&#xff08;2&#xff09;在使用-b参数情况下 3.指定发送ping次数4.通过IP或DNS返回主机名5.通过文件获取目标6.一次ping多个目标7.设置TTL值8.指定网…

入侵检测——fping(扫描篇)

目录 环境介绍参数数据包参照组数据包&#xff08;使用ping命令&#xff09;windows下使用cmd发出的ping包kali在终端中发出的ping包 fping发出的数据包单个主机扫描&#xff08;无回应&#xff09;单个主机扫描&#xff08;有回应&#xff09;网段扫描 规则 环境介绍 NAT模式…