QTableView使用方法小结

article/2025/10/23 9:58:00

本文总结了QTableView常用方法,包括常规的数据显示、表头设置、字体和颜色设置、行列的高宽,显示格式设置等,还有一套分页算法,在QTableView表格里插入QLineEdit、QPushButton、QCheckBox等控件,常用的qss设置,直接显示数据库数据等。

目录

  • 常用设置
  • 常用QSS
  • 效果图
  • QTableView显示数据库表

常用设置

#include "mainwindow.h"
#include "ui_mainwindow.h"MainWindow::MainWindow(QWidget *parent) :QMainWindow(parent),ui(new Ui::MainWindow)
{ui->setupUi(this);pItemModel = new QStandardItemModel();//初始化测试数据for(int index=0;index<23;index++){Student tStudent;tStudent.name = QString("学生%1").arg(index);tStudent.price = QString::number(10000+index);tStudent.number = QString::number(200+index);mvStudent.append(tStudent);}nTotalConut = 0;//一共多少条nTotalPageNum = 0;//一共多少页nCurrPageNum = 0;//当前第几页nPerPageCnt = 5;//每页多少条connect(ui->pushButton_queding,&QPushButton::clicked,this,&MainWindow::slot_pushButton_queding_tz);connect(ui->pushButton_xiayiye,&QPushButton::clicked,this,&MainWindow::slot_pushButton_xiayiye);connect(ui->pushButton_shangyiye,&QPushButton::clicked,this,&MainWindow::slot_pushButton_shangyiye);
}MainWindow::~MainWindow()
{delete ui;
}void MainWindow::displayTable(int nStart, int nEnd)
{int columenCnt = nEnd - nStart + 1;pItemModel->clear();ui->tableView->setModel(pItemModel);QVector<Student> tvStudent = mvStudent.mid(nStart,columenCnt);if(tvStudent.size() != columenCnt){qDebug()<<"["<<__FILE__<<"]"<<__LINE__<<__FUNCTION__<<"分页数据异常";return;}///1.清空表格内容pItemModel->clear();ui->tableView->setModel(pItemModel);///2.设置表头QStringList t_HeaderList_D;t_HeaderList_D<<"序号"<<"姓名"<<"学号"<<"学费\n(元)"<<"爱好"<<"删除"<<"选中";//'\n'表头换行pItemModel->setHorizontalHeaderLabels(t_HeaderList_D);//水平表头///3.设置表头字体和颜色QFont fontHeader("微软雅黑",11);for( int col=0; col<pItemModel->columnCount(); ++col ){QStandardItem *headerItem = pItemModel->horizontalHeaderItem(col);headerItem->setFont(fontHeader);headerItem->setForeground(QBrush(QColor(255, 255, 255)));//设置颜色}///4.行与列数量pItemModel->setRowCount(columenCnt);//设置行数量pItemModel->setColumnCount(7);//设置列数量///5.填充表格内容for(int index=0;index<columenCnt;index++){//新建单元格,初始化内容pItemModel->setItem(index, 0, new QStandardItem(QString::number(index+1)));pItemModel->setItem(index, 1, new QStandardItem(tvStudent.at(index).name));pItemModel->setItem(index, 2, new QStandardItem(tvStudent.at(index).number));pItemModel->setItem(index, 3, new QStandardItem(tvStudent.at(index).price));//单元格内容居中pItemModel->item(index,0)->setTextAlignment(Qt::AlignCenter);pItemModel->item(index,1)->setTextAlignment(Qt::AlignCenter);pItemModel->item(index,2)->setTextAlignment(Qt::AlignCenter);pItemModel->item(index,3)->setTextAlignment(Qt::AlignCenter);//设置单元格字体pItemModel->item(index,0)->setFont(QFont("微软雅黑",10));pItemModel->item(index,1)->setFont(QFont("微软雅黑",10));pItemModel->item(index,2)->setFont(QFont("微软雅黑",10));pItemModel->item(index,3)->setFont(QFont("微软雅黑",10));int subscript = (nCurrPageNum - 1)*nPerPageCnt + index;///结构体容器下标///创建QLineEditQLineEdit *aihao = new QLineEdit(this);ui->tableView->setIndexWidget(pItemModel->index(index, 4), aihao);aihao->setFont(QFont("微软雅黑",18));aihao->setProperty("id",index);aihao->setText(mvStudent.at(subscript).aihao);connect(aihao,&QLineEdit::textChanged,this,&MainWindow::slot_QLineEdit_aihao_textChanged);///创建QPushButtonQPushButton *button = new QPushButton(this);button->setProperty("id", index);button->setText("删除");ui->tableView->setIndexWidget(pItemModel->index(index, 5), button);connect(button,&QPushButton::clicked,this,&MainWindow::slot_QPushButton_TAB_SC);///创建QCheckBoxQCheckBox *CheckBox = new QCheckBox(this);CheckBox->setProperty("id", index);ui->tableView->setIndexWidget(pItemModel->index(index, 6), CheckBox);CheckBox->setStyleSheet("QCheckBox::indicator{ subcontrol-position:center  center;width: 39px;height: 39px;}");connect(CheckBox,&QCheckBox::clicked,this,&MainWindow::slot_CheckBox_tabChicked);if(vbChecked.at(subscript) == true)CheckBox->setChecked(true);}//    pItemModel->item(1, 0)->setForeground(QBrush(QColor(255, 0, 0)));//设置单元格字体颜色
//    pItemModel->sort(0, Qt::DescendingOrder);//第0列降序排序///6.设置单元格宽度ui->tableView->setModel(pItemModel);ui->tableView->setColumnWidth(0,46 );ui->tableView->setColumnWidth(1,180);ui->tableView->setColumnWidth(2,90 );ui->tableView->setColumnWidth(3,90 );ui->tableView->setColumnWidth(4,120 );ui->tableView->setColumnWidth(5,90);ui->tableView->setColumnWidth(6,80 );///7.通用设置
//    ui->tableView->verticalHeader()->setVisible(false);//垂直表头不显示
//    ui->tableView->horizontalHeader()->setVisible(false);//水平表头不显示
//    ui->tableView->setSelectionBehavior(QAbstractItemView::SelectRows);//设置选中整行ui->tableView->setEditTriggers(QAbstractItemView::NoEditTriggers);//设置不可编辑
//    ui->tableView->horizontalHeader()->setSectionResizeMode(QHeaderView::Stretch);//设置自适应调整宽度,填充整个屏幕
//    ui->tableView->setShowGrid(false);//不显示网格线
//    ui->tableView->setStyleSheet("QTableView::Item{border:0px solid rgb(0,0,0);"
//                                 "border-bottom:1px solid rgb(0,0,0);}");//不显示网格线时,添加下划线ui->tableView->setAlternatingRowColors(true);//设置相邻行颜色交替显示ui->tableView->verticalHeader()->setDefaultSectionSize(39);//设置默认行高ui->tableView->setSelectionMode(QAbstractItemView::NoSelection);//设置表格不可被选中
//    QTableWidgetItem *item=ui->tableView->item(0,4);//设置表格中某个单元格不可被选中,QTableWidget有该方法
//    item->setFlags(item->flags()&~Qt::ItemIsSelectable);ui->tableView->resizeColumnToContents(2);//根据内容自动调整某列的列宽ui->tableView->resizeColumnsToContents();//根据内容自动调整所有列的列宽ui->tableView->resizeRowToContents(2);//根据内容自动调整某一行的行高ui->tableView->resizeRowsToContents();//根据内容自动调整所有行的行高。
}/*** @brief 计算表格数据,总共多少条,分多少页,当前第几页* @param count 总共多少条记录*/
void MainWindow::cptPageData(int count)
{if(nPerPageCnt == 0)return;nTotalConut = count;nTotalPageNum = nTotalConut/nPerPageCnt + (nTotalConut%nPerPageCnt ? 1 : 0);if(count > 0){nCurrPageNum = 1;}else{nCurrPageNum = 0;}
}/*** @brief 计算表格每页下标范围* @param nStart 起始下标* @param nEnd 截止下标*/
void MainWindow::cptSubscriptRange(int &nStart, int &nEnd)
{if(nPerPageCnt == 0)return;if(nCurrPageNum < nTotalPageNum)//每页nPerPageCnt条{nStart = (nCurrPageNum - 1)*nPerPageCnt;nEnd = nCurrPageNum*nPerPageCnt - 1;}else if(nCurrPageNum == nTotalPageNum)//最后一页,条数<=5{if(nTotalConut%nPerPageCnt == 0)//最后一页刚好是nPerPageCnt条{nStart = (nCurrPageNum - 1)*nPerPageCnt;nEnd = (nCurrPageNum)*nPerPageCnt - 1;}else{nStart = (nCurrPageNum - 1)*nPerPageCnt;nEnd = (nCurrPageNum - 1)*nPerPageCnt + nTotalConut%nPerPageCnt - 1;}}
}/*** @brief 设置提示信息* @param yeshu 总共多少页* @param count 总共多少条* @param currYe 当前第几页*/
void MainWindow::setlabel_tishi(int yeshu, int count, int currYe)
{ui->label_tishi->setText(QString("共计%1页,%2条记录,当前第%3页").arg(QString::number(yeshu)).arg(QString::number(count)).arg(QString::number(currYe)));
}///删除按钮-确认
void MainWindow::slot_QPushButton_TAB_SC()
{QPushButton*  p_sender = qobject_cast<QPushButton*>(sender());int id = p_sender->property("id").toInt();int subscript = (nCurrPageNum - 1)*nPerPageCnt + id;//账单列表billList,当前选择下标if(subscript >= mvStudent.size()){return;}mvStudent.remove(subscript);cptPageData(mvStudent.size());int nStart = 0;int nEnd = 0;cptSubscriptRange(nStart,nEnd);displayTable(nStart,nEnd);setlabel_tishi(nTotalPageNum,nTotalConut,nCurrPageNum);
}///爱好输入框内容变化
void MainWindow::slot_QLineEdit_aihao_textChanged(QString text)
{QLineEdit*  p_sender = qobject_cast<QLineEdit*>(sender());int id = p_sender->property("id").toInt();int subscript = (nCurrPageNum - 1)*nPerPageCnt + id;mvStudent[subscript].aihao = text;
}///表格中的QCheckBox被点击
void MainWindow::slot_CheckBox_tabChicked()
{QCheckBox*  p_sender = qobject_cast<QCheckBox*>(sender());int id = p_sender->property("id").toInt();int subscript = (nCurrPageNum - 1)*nPerPageCnt + id;if(vbChecked.at(subscript) == true){vbChecked[subscript] = false;}else{vbChecked[subscript] = true;}
}///确定
void MainWindow::slot_pushButton_queding_tz()
{int target = ui->lineEdit_yeshu->text().toInt();if(target<=0 || target > nTotalPageNum)return;nCurrPageNum = target;int nStart = 0;int nEnd = 0;cptSubscriptRange(nStart,nEnd);displayTable(nStart,nEnd);setlabel_tishi(nTotalPageNum,nTotalConut,nCurrPageNum);
}///下一页
void MainWindow::slot_pushButton_xiayiye()
{if(nCurrPageNum +1 > nTotalPageNum)return;nCurrPageNum = nCurrPageNum + 1;int nStart = 0;int nEnd = 0;cptSubscriptRange(nStart,nEnd);displayTable(nStart,nEnd);setlabel_tishi(nTotalPageNum,nTotalConut,nCurrPageNum);
}///上一页
void MainWindow::slot_pushButton_shangyiye()
{if(nCurrPageNum -1 <= 0)return;nCurrPageNum = nCurrPageNum - 1;int nStart = 0;int nEnd = 0;cptSubscriptRange(nStart,nEnd);displayTable(nStart,nEnd);setlabel_tishi(nTotalPageNum,nTotalConut,nCurrPageNum);
}///显示
void MainWindow::on_pushButton_display_clicked()
{int hukouNum = mvStudent.size();cptPageData(hukouNum);vbChecked.clear();for(int index=0;index<nTotalConut;index++){bool ische = false;vbChecked.append(ische);}int nStart = 0;int nEnd = 0;cptSubscriptRange(nStart,nEnd);displayTable(nStart,nEnd);setlabel_tishi(nTotalPageNum,nTotalConut,nCurrPageNum);
}

常用QSS

包括左上角表头按钮样式,水平表头和垂直表头样式设置

QTableView QTableCornerButton::section { border-image: url(./images/yuanxing.png); }
QTableView QTableCornerButton::section:hover { border-image: url(./images/chengse.png); }
QTableView QTableCornerButton::section:pressed { border-image: url(./images/lvse.png); }QHeaderView { border-image: url("./images/tableview/title_normal.png") 1px; border-width: 1px; padding: -1px; }
QHeaderView::section:horizontal { background: transparent; border-width: 2px; padding: -2px; min-height: 49px;}
QHeaderView::section:horizontal { border-image: url("./images/tableview/title_normal.png") 2px; }
QHeaderView::section:horizontal:hover { border-image: url("./images/tableview/title_hover.png") 2px; }
QHeaderView::section:horizontal:pressed { border-image: url("./images/tableview/title_selected.png") 2px; }
QHeaderView::section:vertical { background: transparent; border-width: 2px; padding: -2px; min-width: 30px;  width: 30px; }
QHeaderView::section:vertical { border-image: url("./images/tableview/lefttitle_normal.png") 2px; }
QHeaderView::section:vertical:hover { border-image: url("./images/tableview/lefttitle_hover.png") 2px; }
QHeaderView::section:vertical:pressed { border-image: url("./images/tableview/lefttitle_selected.png") 2px; }

效果图

在这里插入图片描述

QTableView显示数据库表

上面介绍的数据显示方式是单元格逐一赋值的,如果是显示sqlite、Oracle等数据库中的表格,有更简单的方法,使用QSqlTableModel类。

GlobalVar_QSRM::g_pdjDataBase = QSqlDatabase::addDatabase("QSQLITE");GlobalVar_QSRM::g_pdjDataBase.setDatabaseName(GlobalVar_QSRM::g_DataBaseFile);//初始化数据库
QSqlTableModel *pSqlTableModel;//显示数据库的model
pSqlTableModel = new QSqlTableModel(this,GlobalVar_QSRM::g_pdjDataBase);pSqlTableModel->setTable("RefrashSaleman");//可以传数据库表名,也可以传数据库视图名
ui->tableView->setModel(pSqlTableModel);
pSqlTableModel->select();
//默认最多显示256条,这里可以加载全部数据
while(pSqlTableModel->canFetchMore())
{pSqlTableModel->fetchMore();
}
//设置表头
pSqlTableModel->setHeaderData(0,Qt::Horizontal,"ID");
pSqlTableModel->setHeaderData(1,Qt::Horizontal,"姓名");
pSqlTableModel->setHeaderData(2,Qt::Horizontal,"登陆密码");
pSqlTableModel->setHeaderData(3,Qt::Horizontal,"星级");
pSqlTableModel->setHeaderData(4,Qt::Horizontal,"营业厅代码");
pSqlTableModel->setHeaderData(5,Qt::Horizontal,"所属营业厅");
pSqlTableModel->setHeaderData(6,Qt::Horizontal,"状态");//精确查询
QString cellname = ui->LineEditCellName->text().trimmed();//去掉字符串前后的空白部分
QString str = QString("cellname = '%1'").arg(cellname);
modelDspDB->setFilter(str);
modelDspDB->select();//模糊查询
QString str = " ";
QString cellname = ui->LineEditCellName->text().trimmed();
if(!cellname.isEmpty())
{str = QString("cellname like '%%1%'").arg(cellname);
}elsereturn;modelDspDB->setFilter(str);
modelDspDB->select();

http://chatgpt.dhexx.cn/article/Qqc3vxH0.shtml

相关文章

Qt之QTableView的简单使用(含源码+注释)

文章目录 一、QTableView操作示例图二、QTableView&#xff08;个人理解&#xff09;三、源码CMainWindow.hCMainWindow.cpp 四、拓展&#xff1a;代理的使用总结相关文章 一、QTableView操作示例图 下图为QTableView简单使用示例图&#xff0c;其中包含设置、获取、新建item等…

QTableView 基本使用

一、简介 表格视图控件 QTableView&#xff0c;需要和 QStandardItemModel 配套使用&#xff0c;这套框架是基于 MVC 设计模式设计的&#xff0c;M(Model) 是 QStandardItemModel 数据模型不能单独显示出来。V(view) 是指 QTableView 视图&#xff0c;要来显示数据模型&#x…

QTableView详细使用说明

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

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…