文章目录
前言
QTableview多单元格的复制、粘贴。可以在word或者excel表格中复制后粘贴到tableview。我这里是直接在mainwindow里写的这个函数,规范来说应该继承QTableview后,在派生类中重新keyPressEvent函数。
关键代码
void MainWindow::keyPressEvent(QKeyEvent *keyEvent)
{
if(keyEvent->matches(QKeySequence::Copy))//复制
{
QModelIndexList indexList = ui->tableView->selectionModel()->selectedIndexes();
if(indexList.isEmpty())
return;
int startRow = indexList.first().row();
int endRow = indexList.last().row();
int startCol = indexList.first().column();
int endCol = indexList.last().column();
QStringList clipboardTextList;
for(int i = startRow;i <= endRow;i++)
{
QStringList rowText;
for(int j = startCol;j <= endCol;j++)
{
rowText.append(m_model.data(m_model.index(i,j)).toString());
}
clipboardTextList.append(rowText.join('\t'));
}
QString clipboardText = clipboardTextList.join('\n');
QApplication::clipboard()->setText(clipboardText);
}
else if (keyEvent->matches(QKeySequence::Paste))
{
QString clipboardText = QApplication::clipboard()->text();
if(clipboardText.isEmpty())
return;
QStringList rowTextList = clipboardText.split('\n');
if(rowTextList.last().isEmpty())//从word或者excel复制的内容后面可能会带'\n',导致split出来后面有个空字符串。
rowTextList.removeLast();
QModelIndexList indexList = ui->tableView->selectionModel()->selectedIndexes();
if(indexList.isEmpty())
return;
QModelIndex startIndex = indexList.first();
for(int i = 0;i < rowTextList.size();i++)
{
QStringList itemTextList = rowTextList.at(i).split('\t');
for(int j = 0;j < itemTextList.size();j++)
{
QModelIndex curIndex = m_model.index(i + startIndex.row(),j + startIndex.column());
if(curIndex.isValid())
{
m_model.setData(curIndex,itemTextList.at(j));
}
}
}
}
}