Я разрабатываю пользовательский интерфейс с несколькими функциями.На .ui у меня есть QTableView.После щелчка правой кнопкой мыши на табличном представлении я открываю диалоговое окно с тем же QTableView, что упрощает визуализацию данных.После попытки скопировать и вставить некоторые значения, скажем, из ячейки в другую или из столбца в другой столбец, у меня странное поведение, которое я не знаю, как решить.Ниже я пытаюсь скопировать ctrl+C
выбранную ячейку:
И вставить ее ctrl+V
Я получаю странное поведение:
По некоторым причинам я копирую заголовок "долгота" во второй строке вместо номера 24. Кроме того, число 200 помещается ниже.
Этот код также позволяет копировать и вставлять из QTableView в файл Excel, эти функции работают хорошо, но я решил включить его в объяснение, чтобы вы знали, как я обрабатываю все циклы.
editdialog.h
private:
Ui::editLeftTableDialog *ui;
QSqlTableModel *mModel;
QAction *mActionAppendRow;
QAction *mActionDeleteRow;
protected:
void keyPressEvent(QKeyEvent *event);
editdialog.cpp
void editLeftTableDialog::keyPressEvent(QKeyEvent *event)
{
{
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));
}
}
}
}
}
// Copy from QTableView to an Excel or CSV file happens here and works well
QAbstractItemModel * model = ui->tableViewLeft->model();
QItemSelectionModel *selection = ui->tableViewLeft->selectionModel();
QModelIndexList indices = selection->selectedIndexes();
if(indices.isEmpty())
return;
QMap<int, bool> selectedColumnsMap;
Q_FOREACH (QModelIndex current, indices)
{
selectedColumnsMap[current.column()] = true;
}
QList<int> selectedColumns = selectedColumnsMap.uniqueKeys();
int minCol = selectedColumns.first();
// prepend headers for selected columns
QString selectedText;
Q_FOREACH (int column, selectedColumns)
{
selectedText += ui->tableViewLeft->model()->headerData(column, Qt::Horizontal, Qt::DisplayRole).toString();
if(column != selectedColumns.last())
selectedText += QLatin1Char('\t');
}
selectedText += QLatin1Char('\n');
qSort(indices);
int lastRow = indices.first().row();
int lastColumn = minCol;
Q_FOREACH(QModelIndex current, indices)
{
if(current.row() != lastRow)
{
selectedText += QLatin1Char('\n');
lastColumn = minCol;
lastRow = current.row();
}
if(current.column() != lastColumn)
{
for(int i = 0; i < current.column() - lastColumn; ++i)
selectedText += QLatin1Char('\t');
lastColumn = current.column();
}
selectedText += ui->tableViewLeft->model()->data(current).toString();
}
selectedText += QLatin1Char('\n');
QApplication::clipboard()->setText(selectedText);
}