i есть qtableview < /code>, который показывает содержимое qsqltablemodel < /code> (sqlite).
стратегия редактирования установлена на onrowchange < /code> и использование двух qpushbutton я позволяю пользователю добавлять новую запись или удалить одну.
Как воспроизвести проблему
- Добавить новую запись и редактировать по своему усмотрению < /li>
< /ol>
Не отправляйте его, т.е. нажмите esc отбросить текущее редактирование
- Добавить еще раз новую запись и редактировать по своему желанию < /li>
< /ol>
[
Отправить его, т.е. = "https://i.sstatic.net/gq6wf9iz.png"/>
Удалить запись
ожидаемое поведение
На шаге 2 мы отбросили текущее редактирование, и мы не . Шаг 5, после удаления представленного (на шаге 4) «Призрак» отброшенной записи на самом деле есть! 1 : если предыдущая запись не была отброшена, а представлена (по любой причине), индекс должен быть 2 .
Вопросы < /p>
Что здесь происходит? Как предотвратить это нежелательное поведение? < /p>
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include
#include
QT_BEGIN_NAMESPACE
namespace Ui {
class MainWindow;
}
QT_END_NAMESPACE
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
MainWindow(QWidget *parent = nullptr);
~MainWindow();
private:
Ui::MainWindow *ui;
QSqlRelationalTableModel *_model = nullptr;
private slots:
void add();
void remove();
};
#endif // MAINWINDOW_H
написанного значения. mainwindow.cpp
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include
#include
#include
#include
MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), ui(new Ui::MainWindow)
{
ui->setupUi(this);
connect(ui->btnAdd, &QPushButton::clicked, this, &MainWindow::add);
connect(ui->btnRemove, &QPushButton::clicked, this, &MainWindow::remove);
QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE", "mydb");
db.setDatabaseName("mydb.sql");
db.open();
QSqlQuery query("DROP TABLE IF EXISTS foo", db);
query.exec();
QString sql = "CREATE TABLE foo \
(variant TEXT NOT NULL, \
name TEXT NOT NULL, \
capacity INT NOT NULL DEFAULT '0', \
PRIMARY KEY (name));";
query.prepare(sql);
query.exec();
_model = new QSqlRelationalTableModel(this, db);
_model->setTable("foo");
_model->setEditStrategy(QSqlRelationalTableModel::OnRowChange);
ui->table->setSortingEnabled(false);
_model->select();
ui->table->setModel(_model);
ui->table->setItemDelegate(new QSqlRelationalDelegate(this));
ui->table->setFocusPolicy(Qt::TabFocus);
}
MainWindow::~MainWindow()
{
delete ui;
}
void MainWindow::add()
{
_model->insertRow(_model->rowCount());
QModelIndex index = _model->index(_model->rowCount() - 1, 0);
if (!index.isValid()) return;
ui->table->setCurrentIndex(index);
ui->table->edit(index);
}
void MainWindow::remove()
{
int row = ui->table->selectionModel()->currentIndex().row();
_model->removeRow(row);
_model->submitAll();
_model->select();
}
mainwindow.ui
MainWindow
0
0
800
600
MainWindow
Add
Remove
Qt::Orientation::Vertical
20
473
0
0
800
22
Подробнее здесь: https://stackoverflow.com/questions/793 ... nother-row