• 11391阅读
  • 6回复

[原创]QTableWidget表格合并若干问题及解决方法 [复制链接]

上一主题 下一主题
离线qinpanke
 

只看楼主 倒序阅读 楼主  发表于: 2010-10-21
— 本帖被 XChinux 设置为精华(2013-04-04) —
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);
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
自此问题解决。

Q.P.K 2010年9月14日星期二于北京litsoft
[ 此帖被qinpanke在2010-10-21 10:13重新编辑 ]
QQ      308367961
email  qinpanke@sina.com
Blog    http://hi.baidu.com/qinpanke/blog/category/Qt
欢迎大家访问我的博客  共同学习提高
离线qinpanke

只看该作者 1楼 发表于: 2011-10-02
木个回复的人。赏心牙。。。
QQ      308367961
email  qinpanke@sina.com
Blog    http://hi.baidu.com/qinpanke/blog/category/Qt
欢迎大家访问我的博客  共同学习提高
离线ldh8877

只看该作者 2楼 发表于: 2011-12-27
学习了
离线淳于半邪

只看该作者 3楼 发表于: 2011-12-27
合并完之后,设置第二个格子的内容;这里的第二个格子应该是原来的第11格
itemGet = tableWidget->itemAt(1, 11);
离线昨夜星空
只看该作者 4楼 发表于: 2011-12-27
离线gucunlin

只看该作者 5楼 发表于: 2013-04-01
感谢楼主分享
离线weianjiang

只看该作者 6楼 发表于: 2013-11-20
itemAt(QPoint point)使用时错误的,它是获得位于point点的item, 应该是item(row, col),看好帮助文档!!!
快速回复
限100 字节
 
上一个 下一个