Russian Qt Forum

Qt => Базы данных => Тема начата: DEATH от Июнь 16, 2011, 23:25



Название: Qt tableView: удалить строку
Отправлено: DEATH от Июнь 16, 2011, 23:25
Здравствуйте.

Обгуглил, ничего не нашел. Прошу о помощи.
Пишу программу использующую БД, субд взял SQLite.
Выборка в tableView делается с помощью QSqlQueryModel:
Код:
QSqlQueryModel * model  =   new QSqlQueryModel();
model->setQuery("select * from `fm_content`");
Ну и т.д. Теперь необходимо прикрутить к этому удаление/редактирование. Перепробывал много способов, нагуглил много чего - безтолку все.

Вопрос: как удалить с tableView выбранные записи через SQL? Может как то можно получить информацию об этих выбранных полях, что бы достать id и по нему уже удалить/редактировать. Для разделения информация/поиск/... использщуется tabWidget, т.е. для удаления ничего в принципе не надо, а для редактирования нужно выбранные поля передать на другую вкладку, и там уже в полях информацию выбранную вывести. Помогите, будьте добры =) Спасибо.


Название: Re: Qt tableView: удалить строку
Отправлено: sobr_vamp от Июнь 16, 2011, 23:40
Цитировать
как удалить с tableView выбранные записи через SQL?
Не очень понятно, что вы имеете в виду.
Может это поможет? http://www.prog.org.ru/topic_12455_0.html (http://www.prog.org.ru/topic_12455_0.html)


Название: Re: Qt tableView: удалить строку
Отправлено: DEATH от Июнь 16, 2011, 23:44
Код
C++ (Qt)
QTableView *table;
int count = table->selectionModel()->selectedRows().count();
for( int i = 0; i < count; i++)
table->model()->removeRow( table->selectionModel()->selectedRows().at( i).row(), QModelIndex());

Так я делал, ничего не получилось. А я имею ввиду следующее:
Есть какие то записи:

... / ... / ...
Вася / Физика / 2
Петя / математика / 3

Я выбрал одно из полей (или несколько) и мне их нужно удалить. НО, записи выбираются с помощью SQL, через QSqlQueryModel. Как получить информацию о выбранном(ых) поле. И удалить. Ну или отредактировать.


Название: Re: Qt tableView: удалить строку
Отправлено: sobr_vamp от Июнь 16, 2011, 23:52
Я выбрал одно из полей (или несколько) и мне их нужно удалить. НО, записи выбираются с помощью SQL, через QSqlQueryModel. Как получить информацию о выбранном(ых) поле. И удалить. Ну или отредактировать.

Давайте проясним.
У вас есть QTableView и для него определена модель.
В этой модели есть строки и столбцы и их можно выделить.
Вы их хотите удалить? Те строки, которые пользователь выделил мышкой?
Если да, то приведённый код должен работать и SQL тут вообще ни при чем.
Если нет, то что тогда такое "поля"? И откуда вы их хотите удалить?


Название: Re: Qt tableView: удалить строку
Отправлено: DEATH от Июнь 16, 2011, 23:54
Именно так. Но ведь данные берутся из БД. И удалить их нужно не только с самой таблицы, но и с БД.

Вот код выборки:
Код
C++ (Qt)
   QSqlDatabase db =   QSqlDatabase::addDatabase("QSQLITE");
   db.setDatabaseName("films");
   db.open();
 
   QSqlQueryModel * model  =   new QSqlQueryModel();
   model->setQuery("select * from `fm_content`");
 
   model->removeColumn(0);
   model->setHeaderData(0, Qt::Horizontal, "Имя");
 
   ui->tableView->setModel(model);
   ui->tableView->resizeRowsToContents();

Как то так.


Название: Re: Qt tableView: удалить строку
Отправлено: DEATH от Июнь 17, 2011, 00:06
Код
C++ (Qt)
int count = ui->tableView->selectionModel()->selectedRows().count();
На выходе 1, сообственно так и должно быть, выбрал 1 запись. А дальше тишина. Не удаляется ничего =(


Название: Re: Qt tableView: удалить строку
Отправлено: sobr_vamp от Июнь 17, 2011, 00:08
Из документации:
void QSqlQueryModel::setQuery ( const QSqlQuery & query )
Resets the model and sets the data provider to be the given query.

Если мне не изменяет мой английский, то модель поменяется в соответсвии с запросом.
Значит напрямую удалять из QTableView не надо.
1. Загоняете номера выделенных строк в какой-нибудь QList
2. Пишете DELETE запрос с условием "... WHERE attr_name IN (" + номера_строк_через_зпт + ");"
3. В результате строки из базы удалятся, модель обновится и в QTableView будет всё здорово.

Но это лишь моя догадка. Пробуйте ;)


Название: Re: Qt tableView: удалить строку
Отправлено: DEATH от Июнь 17, 2011, 00:14
1. Загоняете номера выделенных строк в какой-нибудь QList

Сообственно меня интересует как их получить? А дальше никаких проблем =)


Название: Re: Qt tableView: удалить строку
Отправлено: sobr_vamp от Июнь 17, 2011, 00:22
http://doc.qt.nokia.com/latest/qabstractitemview.html#selectedIndexes

Использовать как-то так:
Код:
QModelIndexList indexes = ui.tableView->selectionModel()->selection().indexes();


Название: Re: Qt tableView: удалить строку
Отправлено: DEATH от Июнь 17, 2011, 00:28
Я в ответ получу индексы? Индексы узнать это одно... мне нужно узнать само значение уже инфы, к примеру имя Вася. или предмет, или оценку...


Название: Re: Qt tableView: удалить строку
Отправлено: sobr_vamp от Июнь 17, 2011, 00:41
Мне кажется, вы всё-таки плохо гуглите =))
http://doc.qt.nokia.com/latest/qitemselectionmodel.html#currentIndex

http://doc.qt.nokia.com/latest/qmodelindex.html#row
http://doc.qt.nokia.com/latest/qmodelindex.html#column


Название: Re: Qt tableView: удалить строку
Отправлено: DEATH от Июнь 17, 2011, 00:46
Мне кажется что я с этим курсовым скоро свихнусь. Можно маленький пример?
Я нагуглил:
Код
C++ (Qt)
QModelIndexList indexes =   ui->tableView->selectionModel()->selection().indexes();
   foreach(QModelIndex index, indexes) {
       QSqlRecord * record = model->record(index.row());
       QString name = record->value("name").toString();
   }

Как то так. Но ничего не получается, куча ошибок %)


Название: Re: Qt tableView: удалить строку
Отправлено: DEATH от Июнь 17, 2011, 00:54
Ура, получилось, просто не проинклудил кой чо)

Код
C++ (Qt)
   QModelIndexList indexes =   ui->tableView->selectionModel()->selection().indexes();
   foreach(QModelIndex index, indexes) {
       QSqlRecord record = model->record(index.row());
       int id = record.value("id").toInt();
   }

Ещё небольшой вопрос, слева в самом tableView выводится нумерация строк. Её можно отрубить?


Название: Re: Qt tableView: удалить строку
Отправлено: DEATH от Июнь 17, 2011, 03:42
Я помоему спать хочу)))

Код
C++ (Qt)
       QImage image;
       image.load(file, "JPG");
       if (image.isNull()) {
           QMessageBox::information(this, "&#1054;&#1096;&#1080;&#1073;&#1082;&#1072;", "&#1053;&#1077; &#1091;&#1076;&#1072;&#1083;&#1086;&#1089;&#1100; &#1086;&#1090;&#1082;&#1088;&#1099;&#1090;&#1100; &#1092;&#1072;&#1081;&#1083;");
       } else {
           image.scaled(QSize(240, 320), Qt::IgnoreAspectRatio);
           if (!image.save("/home/death/Video/test.jpg", "JPG", 80)) {
               QMessageBox::information(this, "&#1054;&#1096;&#1080;&#1073;&#1082;&#1072;", "&#1053;&#1077; &#1091;&#1076;&#1072;&#1083;&#1086;&#1089;&#1100; &#1089;&#1086;&#1093;&#1088;&#1072;&#1085;&#1080;&#1090;&#1100; &#1080;&#1079;&#1086;&#1073;&#1088;&#1072;&#1078;&#1077;&#1085;&#1080;&#1077;");
           }
       }

Вообщем то все открывается и сохраняется, но к сожалению с исходным размером =( Как правильно?
И ещё, как узнать текущую папку? С которой запущена прога. Просто в ней надо будет хранить изображения, в подпапке.

P.S. Лаг койта вздесь, поредачил месагу и в теге [ code ] уплыл рус. текст =(


Название: Re: Qt tableView: удалить строку
Отправлено: pokidoff от Июнь 17, 2011, 07:25
Вообще QSqlQueryModel - readOnly модель. Чтобы редактировать,удалять и вставлять строки надо пользоваться как минимум QSqlTableModel.
PS: почитай про метод QSqlTableModel::removeRows


Название: Re: Qt tableView: удалить строку
Отправлено: DenisKh001 от Июнь 17, 2011, 18:44
пишу код: ui->tableView->model()->removeRow(ui->tableView->currentIndex(),QModelIndex());
естественно жалуется на "QModelIndex()" - что это такое? откуда брать, как правильно написать и зачем она нужна?


Название: Re: Qt tableView: удалить строку
Отправлено: sobr_vamp от Июнь 17, 2011, 20:30
пишу код: ui->tableView->model()->removeRow(ui->tableView->currentIndex(),QModelIndex());
естественно жалуется на "QModelIndex()" - что это такое? откуда брать, как правильно написать и зачем она нужна?

Читайте тут внимательно
http://doc.qt.nokia.com/latest/qabstractitemmodel.html#removeRow (http://doc.qt.nokia.com/latest/qabstractitemmodel.html#removeRow)
Removes the given row from the child items of the parent specified.

Думаю можно наприсать просто ...->removeRow(ui->tableView->currentIndex())


Название: Re: Qt tableView: удалить строку
Отправлено: DenisKh001 от Июнь 17, 2011, 21:12
Разобрался, над писать так:
QModelIndex idIndex = ui->tableView->selectionModel()->selectedRows().at(0);
model->removeRow(idIndex.row()); // удаляем ПЕРВУЮ ВЫДЕЛЕННУЮ позицию.
или
model->removeRow(ui->tableView->currentIndex().row()); // удаляем ТЕКУЩУЮ позицию.