Почему INSERT и DELETE портят QTableView (Qt, C ++, sqlite)? - PullRequest
1 голос
/ 11 февраля 2011

После установки запроса INSERT или DELETE на QSqlQueryModel мой QTableView облажается. Например, я спрятал столбец идентификатора, вызвав view->hideColumn(ID);, но после ВСТАВКИ или УДАЛЕНИЯ столбец идентификатора становится видимым.

Как в этих случаях автоматически сбросить вид на предыдущие настройки?

1 Ответ

4 голосов
/ 14 февраля 2011

Полагаю, проблема в QSqlQueryModel :: setQuery , которую вы в конечном итоге вызываете каждый раз, когда содержимое перезагружается и строки вставляются \ удаляются.Глядя на реализацию setQuery, я бы посоветовал: в зависимости от запроса ваша модель может быть сброшена, включая изменение настроек столбцов, что должно вызвать обновление представления столбцов.

Как следует из документации Qt:

Класс QSqlQueryModel предоставляет модель данных только для чтения для наборов результатов SQL.

, поэтому я бы использовал прямой QSqlQuery вызывает обновления данных и затем перезагрузит модель с тем же запросом.Или подумайте о переключении на QSQLTableModel , который очень удобен для манипулирования содержимым одной таблицы и поддерживает вставку обновлений и удалений.Посмотрите, подойдет ли вам приведенный ниже пример:

настроить базу данных, представление и модель:

QSqlTableModel *_model;
QTableView *_view;

...

QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE");
db.setDatabaseName(":memory:");
db.open() ;

QSqlQuery query;
query.prepare("CREATE TABLE IF NOT EXISTS person (id INTEGER UNIQUE PRIMARY KEY, name VARCHAR(30))");
query.exec();
query.prepare("INSERT INTO person (name) VALUES ('test1')");
query.exec();
query.prepare("INSERT INTO person (name) VALUES ('test2')");
query.exec();

_model = new QSqlTableModel(this, db);
_model->setTable("person");
_model->setEditStrategy(QSqlTableModel::OnManualSubmit);
_model->select();
_model->setHeaderData(1, Qt::Horizontal, tr("name"));
_model->setSort(1, Qt::AscendingOrder);

_view = new QTableView(this);
_view->setModel(_model);
_view->hideColumn(0);

добавить новую строку:

QSqlRecord record;
_model->insertRecord(-1, record);

удалить выбранные строки:

QModelIndexList selected = _view->selectionModel()->selectedIndexes();
for (int i = 0; i < selected.size(); ++i)
    _model->removeRows(selected.at(i).row(), 1);

отправить изменения:

_model->submitAll();

надеюсь, это поможет, с уважением

...