Я пытаюсь реализовать QKeySequence::Undo
и QKeySequence::Redo
для восстановления ячеек, которые могут быть случайно удалены из QTableView при работе с ctrl+C
и ctrl+V
командами копирования и вставки.Однако я не уверен, как реализовать эти функции.Я просматривал документацию Qt здесь , но так и не смог легко ее реализовать.
Ради полноты вопроса я включаю все циклы, которые я реализую (ctrl+C
Copy и ctrl+V
Paste включены).Ниже приведена часть кода, в которой у меня есть некоторые проблемы, и я надеюсь, что кто-то может указать мне правильное направление:
editlefttabledialog.h
private:
Ui::editLeftTableDialog *ui;
QSqlTableModel *mModel;
protected:
void keyPressEvent(QKeyEvent *event);
editlefttabledialog.cpp
{
QAbstractItemModel * modelRemoveAdd = ui->tableViewLeft->model();
QItemSelectionModel *selectionModel = ui->tableViewLeft->selectionModel();
QModelIndexList selectedRows = selectionModel->selectedRows();
QAbstractItemModel * modelNew = ui->tableViewLeft->model();
QItemSelectionModel *selectedIndexes = ui->tableViewLeft->selectionModel();
QModelIndexList selectedInd = selectedIndexes->selectedIndexes();
// Make sure one row is selected
if(!selectedRows.isEmpty())
{
if(event->key() == Qt::Key_Insert)
mModel->insertRows(selectedRows.at(0).row(),
selectedRows.size());
else if(event->key() == Qt::Key_Delete)
mModel->removeRows(selectedRows.at(0).row(),
selectedRows.size());
}
// Make sure one cell selected
if(!selectedInd.isEmpty())
{
if(event->key() == Qt::Key_Delete)
foreach(QModelIndex index, selectedInd)
mModel->setData(index, QString());
else if(event->matches(QKeySequence::Copy))
{
QString text;
QItemSelectionRange range = ui->tableViewLeft->selectionModel()->selection().first();
for(auto i = range.top(); i <= range.bottom(); ++i)
{
QStringList rowContents;
for(auto j = range.left(); j <= range.right(); ++j)
rowContents << mModel->index(i,j).data().toString();
text += rowContents.join("\t");
text += "\n";
}
QApplication::clipboard()->setText(text);
}
else if(event->matches(QKeySequence::Paste))
{
QString text = QApplication::clipboard()->text();
QStringList rowContents = text.split("\n", QString::SkipEmptyParts);
QModelIndex initIndex = ui->tableViewLeft->selectionModel()->selectedIndexes().at(0);
auto initRow = initIndex.row();
auto initCol = initIndex.column();
for(auto i = 0; i < rowContents.size(); i++)
{
QStringList columnContents = rowContents.at(i).split("\t");
for(auto j = 0; j < columnContents.size(); j++)
{
mModel->setData(mModel->index(initRow + i, initCol + j), columnContents.at(j));
}
}
}
else if(event->matches(QKeySequence::Undo))
{
}
else if(event->matches(QKeySequence::Redo))
{
}
}
}