QTableWidget表格合并若干问题及解决方法
Qt提供 QTableWidget作为表格的类以实现表格的基本功能,表格中所装载的每一个单元格由类QTableWidgetItem提供。这是基于表格实现 Qt提供的一个基础类,若想实现定制表格和单元格的功能则需要派生重写,使用Qt经典的MV结构 QTableView+QAbstractItemMode来实现。
关于QTableWidget+QTableWidgetItem使用方法简介:
通常在使用这对组合以实现表格基本功能时,通常的做法是:
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
示例代码一:
QTableWidget* tableWidget = new QTableWidget;
tableWidget->setRowCount(11); // 设置表格的行数
tableWidget->setColumnCount(11); // 设置表格的列数
// 为表格的每一行每一列设置一个可以装载数据的item
for(int nRow = 0; nRow < 11; nRow++)
{
for(int nColumn = 0; nColumn < 11; nColumn++);
{
QTableWidgetItem* item = new QTableWidgetItem;
tableWidget->setItem(nRow, nColumn, item);
}
}
// 通过索引访问表格中的单元格并赋值
QTableWidgetItem* item = tableWidget->itemAt(3, 3);
item->setText(“MyTableItem”);
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
OK!如果你仅仅是操作表格的单元格上述代码没有问题,但是如果你一旦涉及到表格的单元格合并时,这样操作表格就会出问题!
下面是笔者在开发过程中实现表格合并时遇到的一些问题及相关的解决方法:
问题一:如果按照示例代码一方式创建表格和单元格进行表格合并时
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
tableWidget->setSpan(0, 0, 1, 11);
QTableWidgetItem* itemGet = tableWidget->itemAt(0, 0);
itemGet->setTextAlignment(Qt::AlignHCenter);
itemGet->setText(“MyTableItem(0, 0)”);
/* OK!上述代码没问题,实现第一行单元格的合并和设置text */
itemGet = NULL;
itemGet = tableWidget->itemAt(1, 1);
itemGet->setTextAlignment(Qt::AlignHCenter);
itemGet->setText(“MyTableItem(1, 1)”);
/* Error!这里就出问题了,itemAt(1, 1)返回的仍然是itemAt(0, 0)所指向的单元格。就是由表格合并函数tableWidget->setSpan()所带来的问题,表格合并使得itemAt()等相关的索引函数出现问题。(具体原因还不太清楚)*/
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
解决方法:
(1) 既然setSpan()函数破坏了itemAt()的索引,我们可以通过重新建立新的item的方式进行访问方法如下:
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
QTableWidgetItem* newItem = new QTableWidgetItem;
tableWidget->setItem(1, 1, newItem);
newItem->setTextAlignment(Qt::AlignHCenter);
newItem->setText(“MyTableItem(1, 1)”);
/* 这样就可以实现表格其它位置单元格的赋值操作 */
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
(2) 不在创建QTableWidget时为单元格动态创建QTableWidgetItem,而是在用到某个单元格是再动态创建QTableWidgetItem。(推荐使用这种方法,避免内存泄露)
问题二:和问题一的情况相同都是由于索引而产生的,这次是由于selectedRange()索引错误而产生。
使用TableWidget生成表格后,希望通过鼠标的选择合并单元格,这时会发现只有第一次调用selectedRange()能正确返回鼠标所选择的单元格的范围并执行合并成功,第二次以后selectedRanged()返回的永远是鼠标选择范围的第一单元格。
解决方法:使用函数selectedRanges()。该函数将返回QList对象,里面包含了被鼠标选择的所有单元格的位置,这样我们就可以实现多次合并。代码如下:
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
tableWidget->setSpan(tableWidget->selectedRanges().first().topRow(),
tableWidget->selectedRanges().first().leftColumn(),
tableWidget->selectedRanges().last().bottomRow() –
tableWidget->selectedRanges().first().topRow() + 1,
tableWidget->selectedRanges().last().rightColumn() -
tableWidget->selectedRanges().first().leftColumn() + 1);
http://blog.chinaunix.net/uid-22159621-id-3049697.html
----------------------------------------------------------------------------------
Qt:多次合并单元格的时要注意
如果一个QTableView使用setSpan合并后,数据更新后,还要继续使用setSpan再次合并(主要是要对全表格进行重新的单元格合并,已经合并过的地方行列又要重新进行新的合并,因为数据已经更新),这时不能直接使用setSpan,而是要先把QTableView的row还原为原来没有合并行列的情形,再次使用setSpan,否则显示很可能就会发生错误:
if (model != 0) {
// 恢复QTableView的为未合并前的样子
for (int i = 0; i < model->rowCount(); ++i) {
ui->tableView->setSpan(i, 1, 1, 1);
ui->tableView->setSpan(i, 10, 1, 1);
}
}
// 合并单元格
if (currentRow - firstRow != 1) {
ui->tableView->setSpan(firstRow, 1, rowSpan, 1);
ui->tableView->setSpan(firstRow, 10, rowSpan, 1);
}
http://www.cppblog.com/biao/archive/2009/12/11/102955.html
QTableWidget表格合并若干问题及解决方法的更多相关文章
- 百度编辑器ueditor插入表格没有边框颜色的解决方法
附:从word excel 中 复制的表格提交后无边框,参考这个同学的,写的很详细: http://blog.csdn.net/lovelyelfpop/article/details/51678 ...
- 表格线边框重复css解决方法
1.td 的边框和table 的边框重叠 .table { border-left:1px solid #dedede; border-top:1px solid #dedede;} .td { bo ...
- python-docx 添加表格时很慢的解决方法
我们做监控系统的时候常需要给客户发送邮箱报告,附带一个word的文档,文档中插入表格给用户更直观的数据. 我用的时python-docx库操作文档,最近碰到,当往文档中插入表格时,随着表格行数的增多, ...
- 最详细的div边距合并的问题和解决方法
对于前端来说写页面是最基础的东西了,但是想不到还是有人不理解边距合并的问题,昨天有网友问我为什么设置的margin不是我设置的实际效果? 好吧,废话不多说,下面来说一下关于margin合并的问题. 解 ...
- Switch开关在element-ui表格中点击没有效果解决方法
<el-table-column label="三审" align="center"> <template slot-scope=" ...
- adb不识别设备(手机)的若干情形及解决方法
1.执行adb root 提示adb: unable to connect for root: no devices/emulators found:执行adb devices ,List下无设备 ...
- oracle数据库ORA-01654 错误的解决方法
引言: 数据库突然报: ORA-01654: unable to extend index BO.INDEX_indexname by 311072 in tablespace 错误,上网查原因,发现 ...
- ueditor表格边框没有颜色的解决
问题: 用ueditor画表格,会发现表格存在,但是表格边框没有颜色. 解决方法: 需要对js文件中的样式进行修改,这里我引用的编辑器样式文件是ueditor.all.min.js,所以先找到该文件, ...
- git rebase与 git合并(error: failed to push some refs to)解决方法
1.遇到的问题 本地有一个git仓库,在github上新建了一个空的仓库,但是更新了REWADME.md的信息,即在github上多了一个提交. 关联远程仓库,操作顺序如下: git remote a ...
随机推荐
- poj 1084 Brainman(归并排序)
题目链接:http://poj.org/problem?id=1804 思路分析:序列的逆序数即为交换次数,所以求出该序列的逆序数即可. 根据分治法思想,序列分为两个大小相等的两部分,分别求子序列的逆 ...
- layer 的常用属性
layer的各种属性代码示例: - (void)viewDidLoad { [super viewDidLoad]; // Do any additional setup after loading ...
- strut2服务器与android交互数据
libs如图: web.xml: <?xml version="1.0" encoding="UTF-8"?> <web-app versio ...
- 设计模式 - 单例模式mysql数据库操作类
待续... index.php 调用方法: <?php header('Content-Type:text/html; charset=utf8'); require 'instance.php ...
- Codeforces Round #315 (Div. 2C) 568A Primes or Palindromes? 素数打表+暴力
题目:Click here 题意:π(n)表示不大于n的素数个数,rub(n)表示不大于n的回文数个数,求最大n,满足π(n) ≤ A·rub(n).A=p/q; 分析:由于这个题A是给定范围的,所以 ...
- javascript (string 部分)
<html> <body> <script type="text/javascript"> var str="ab:cd:ef:gh& ...
- javascript时间函数
//时间函数 var myDate = new Date(); myDate.getYear(); //获取当前年份(2位) myDate.getFullYear(); //获取完 ...
- ELK 之三:Kibana 使用与Tomcat、Nginx 日志格式处理
一:kibana安装: kibana主要是搜索elasticsearch的数据,并进行数据可视化的展现,新版使用nodejs. 1.下载地址: https://www.elastic.co/downl ...
- OGR SQL (GEOM)
The OGRDataSource supports executing commands against a datasource via the OGRDataSource::ExecuteSQL ...
- JAVAC 命令使用方法
结构 javac [ options ] [ sourcefiles ] [ @files ] 參数可按随意次序排列. options 命令行选项. sourcefiles 一个或多个要编译的源文件( ...