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. Android平台一些流行的使用3D技术开发的锁屏

    题外话:从2007年android系统的发布开始,到2008年的第一款手机问世,再到现在击败塞班,wm,黑霉,然后遍地开花,2013年,智能机出货超过了功能机,android功不可没.一路走来,虽然a ...

  2. Java程序如何自动在线升级

    有时候我们的程序需要连接服务器检测新版本,如果发现新版本则需要自动下载升级.这种需求在Linux下还好说,但在windows下如何替换正在运行的程序文件呢? 当然有办法,步骤如下: 1. 将我们的程序 ...

  3. 2014 北京邀请赛ABDHJ题解

    A. A Matrix 点击打开链接 构造,结论是从第一行開始往下产生一条曲线,使得这条区间最长且从上到下递减, #include <cstdio> #include <cstrin ...

  4. Flask web应用

    Flask web应用 一.介绍 最近开发要用一个测试环境,是这样的Nginx+uwsgi+flask 的一个结构.下面是一些记录,在Centos 系统上使用Flask 架构部署一个简单的Python ...

  5. Android学习笔记:如何高效显示图片,避免内存溢出 和 ImageView无法显示大尺寸的图片

    因为手机的内存资源是有限的,每个app可使用的内存是受限的.而现在采用高分辨率拍的照片往往很大.如果加载时不注意方法,很有可能会引起java.lang.OutofMemoryError: bitmap ...

  6. 红黑树和AVL树的实现与比较-----算法导论

    一.问题描述 实现3种树中的两种:红黑树,AVL树,Treap树 二.算法原理 (1)红黑树 红黑树是一种二叉查找树,但在每个结点上增加一个存储位表示结点的颜色,可以是red或black.红黑树满足以 ...

  7. HDU 1432 Lining Up (POJ 1118)

    枚举,枚举点 复杂度为n^3. 还能够枚举边的,n*n*log(n). POJ 1118 要推断0退出. #include<cstdio> #include<cstring> ...

  8. 基于JSP+SERVLET的新闻发布系统(三)

    拖了这么久..今天把栏目管理还有新闻管理模块的也挂出来.. 栏目管理跟用户管理一样. 这里重点讲解新闻管理. 效果图如上: 1,可选择栏目类别,且栏目类别是动态生成的. 默认生成的文章是未审核状态的. ...

  9. ArrayList集合--C#

    static void Main(string[] args) { //实例化出一个集合对象 ArrayList list = new ArrayList(); /*添加*/ //--添加单个元素 l ...

  10. 点击datalist中Button按钮出现“回发或回调参数无效......”

        遇到问题: 回发或回调参数无效.在配置中使用 <pages enableEventValidation="true"/> 或在页面中使用 <%@ Page ...