Как реализовать QKeySequence :: Undo и QKeySequence :: Redo в QTableView - PullRequest
0 голосов
/ 02 декабря 2018

Я пытаюсь реализовать 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))
            {

            }
        }
    }
...