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表格合并若干问题及解决方法的更多相关文章

  1. 百度编辑器ueditor插入表格没有边框颜色的解决方法

    附:从word excel 中 复制的表格提交后无边框,参考这个同学的,写的很详细:   http://blog.csdn.net/lovelyelfpop/article/details/51678 ...

  2. 表格线边框重复css解决方法

    1.td 的边框和table 的边框重叠 .table { border-left:1px solid #dedede; border-top:1px solid #dedede;} .td { bo ...

  3. python-docx 添加表格时很慢的解决方法

    我们做监控系统的时候常需要给客户发送邮箱报告,附带一个word的文档,文档中插入表格给用户更直观的数据. 我用的时python-docx库操作文档,最近碰到,当往文档中插入表格时,随着表格行数的增多, ...

  4. 最详细的div边距合并的问题和解决方法

    对于前端来说写页面是最基础的东西了,但是想不到还是有人不理解边距合并的问题,昨天有网友问我为什么设置的margin不是我设置的实际效果? 好吧,废话不多说,下面来说一下关于margin合并的问题. 解 ...

  5. Switch开关在element-ui表格中点击没有效果解决方法

    <el-table-column label="三审" align="center"> <template slot-scope=" ...

  6. adb不识别设备(手机)的若干情形及解决方法

    1.执行adb root  提示adb: unable to connect for root: no devices/emulators found:执行adb devices ,List下无设备 ...

  7. oracle数据库ORA-01654 错误的解决方法

    引言: 数据库突然报: ORA-01654: unable to extend index BO.INDEX_indexname by 311072 in tablespace 错误,上网查原因,发现 ...

  8. ueditor表格边框没有颜色的解决

    问题: 用ueditor画表格,会发现表格存在,但是表格边框没有颜色. 解决方法: 需要对js文件中的样式进行修改,这里我引用的编辑器样式文件是ueditor.all.min.js,所以先找到该文件, ...

  9. git rebase与 git合并(error: failed to push some refs to)解决方法

    1.遇到的问题 本地有一个git仓库,在github上新建了一个空的仓库,但是更新了REWADME.md的信息,即在github上多了一个提交. 关联远程仓库,操作顺序如下: git remote a ...

随机推荐

  1. Swift - 1 (常量、变量、字符串、数组、字典、元组、循环、枚举、函数)

    Swift 中导入类库使用import,不再使用<>,导入自定义不再使用"" import Foundation 1> 声明变量和常量 在Swift中使用 &qu ...

  2. ios8 swift开发:显示变量的类名称

    var ivar = [:] ivar.className // __NSDictionaryI var i = 1 i.className // error: 'Int' does not have ...

  3. Mahout机器学习平台之聚类算法具体剖析(含实例分析)

    第一部分: 学习Mahout必需要知道的资料查找技能: 学会查官方帮助文档: 解压用于安装文件(mahout-distribution-0.6.tar.gz),找到例如以下位置.我将该文件解压到win ...

  4. [Swust OJ 541]--排列字典序问题

    题目链接:http://acm.swust.edu.cn/problem/0541/ Time limit(ms): 2000 Memory limit(kb): 65535 n个元素{1,2,... ...

  5. BZOJ 3544: [ONTAK2010]Creative Accounting( BST )

    题意 : 一段序列 , 求一段子序列和取余 M 的最大值 其实是一道水题... 前缀和 , 然后就是找 ( sum( r ) - sum( l ) ) % M 的最大值 . 考虑一个 sum( r ) ...

  6. Jekyll学习:基本使用方法

    Jekyll是一个简单的博客.静态网站生成工具.利用它可以快速的搭建一个网站.并且完全免费的在 GitHub 上发布网站 — 自定义域名. 一.环境搭建 apt-get install jekyll ...

  7. 推断js中的类型:typeof / instanceof / constructor / prototype

    怎样推断js中的类型呢,先举几个样例: var a = "jason"; var b = 123; var c = true; var d = [1,2,3]; var e = n ...

  8. YouTube为什么打不开?以及简便的訪问的方法/解决方式!

    在站点统计中看到好多人通过百度或者谷歌(Google)搜索引擎搜:YouTube怎么上不去,怎样不用代理server訪问YouTube,YouTube上不去的解决的方法,YouTube怎样訪问等等.事 ...

  9. ACM比赛(11462 Age Sort)

    You are given the ages (in years) of all people of a country with at least 1 year of age. You know t ...

  10. 我的Python成长之路---第一天---Python基础(3)---2015年12月26日(雾霾)

    四.变量和常量 变量是用来存储程序运行期间需要临时保存可以不断改变的数据的标识符.Python有自身的内存回收机制,所以在开发过程中不用考虑变量的销毁等 Python中的变量名命名有如下规则: 1.变 ...