思路:
复制:通过selectedRanges()获取选择范围,获取该区域文本并设置文本格式,放到剪切板上。
剪切:从剪切板取文本,根据选择的有效行数与列数设置单元格数据。
支持不连续选择单元格数据。
复制与粘贴代码如下:
//复制
void MainWindow::copyTextToClipboard(QTableWidget *table)
{
QString copyText;
if(table){
const auto &lstSelectRange = table->selectedRanges();
bool bHorSel = false;
bool bVerSel = false;
int selFlag = 0;
for(const auto &selectRange : lstSelectRange){
//跳着选且水平选
if(selFlag < lstSelectRange.size() - 1){
if(lstSelectRange[selFlag].leftColumn() == lstSelectRange[selFlag + 1].rightColumn())
bHorSel = true;
//跳着选且垂直选
else if(lstSelectRange[selFlag].topRow() == lstSelectRange[selFlag + 1].bottomRow()){
bVerSel = true;
}
}
for(int iRow = selectRange.topRow(); iRow <= selectRange.bottomRow(); ++iRow){
QString tempItem;
int colIndex = 0;
for(int iCol = selectRange.leftColumn(); iCol <= selectRange.rightColumn(); ++iCol){
QTableWidgetItem * pItem = table->item(iRow, iCol);
if(pItem){
tempItem.append(pItem->text());
if(colIndex < selectRange.columnCount() - 1 || (bVerSel && selFlag < lstSelectRange.size() - 1))
tempItem.append('\t');
++colIndex;
}
}
copyText.append(tempItem);
if(selectRange.rowCount() > 1 || bHorSel)
copyText.append('\n');
}
++selFlag;
}
}
qDebug() << copyText;
QApplication::clipboard()->setText(copyText);
}
//粘贴
void MainWindow::pastTextFromCliboard(QTableWidget *table)
{
QString pastText = QApplication::clipboard()->text().trimmed();
if(table){
//处理文本
QStringList &lstText = pastText.split('\n');
//根据选中的行数取文本
for(const auto &selectRange : table->selectedRanges()){
//取有效行数与列数
int startRowIndex = selectRange.topRow();
int newRowCnt = table->rowCount() - startRowIndex;
int startColIndex = selectRange.leftColumn();
int newColCnt = table->columnCount() - startColIndex;
//根据有效行取文本
if(lstText.size() > newRowCnt){
for(int i = lstText.size() - 1; i >= newRowCnt; --i)
lstText.removeAt(i);
}
for(auto &item : lstText){
QStringList &lstItem = QString(item).split('\t');
qDebug() << lstItem;
//根据有效列取文本
if(lstItem.size() > newColCnt){
for(int j = lstItem.size() - 1; j >= newColCnt; --j){
lstItem.removeAt(j);
}
}
//设置数据
for(const auto &text : lstItem){
QTableWidgetItem *pItem = table->item(startRowIndex, startColIndex);
if(pItem){
pItem->setText(text);
}else{
pItem = new QTableWidgetItem(text);
table->setItem(startRowIndex, startColIndex, pItem);
}
pItem->setTextAlignment(Qt::AlignCenter);
++startColIndex;
}
++startRowIndex;
startColIndex = selectRange.leftColumn();
}
}
}
}