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