Russian Qt Forum
Ноябрь 24, 2024, 05:55 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1] 2   Вниз
  Печать  
Автор Тема: Qt tableView: удалить строку  (Прочитано 17726 раз)
DEATH
Гость
« : Июнь 16, 2011, 23:25 »

Здравствуйте.

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

Вопрос: как удалить с tableView выбранные записи через SQL? Может как то можно получить информацию об этих выбранных полях, что бы достать id и по нему уже удалить/редактировать. Для разделения информация/поиск/... использщуется tabWidget, т.е. для удаления ничего в принципе не надо, а для редактирования нужно выбранные поля передать на другую вкладку, и там уже в полях информацию выбранную вывести. Помогите, будьте добры =) Спасибо.
Записан
sobr_vamp
Гость
« Ответ #1 : Июнь 16, 2011, 23:40 »

Цитировать
как удалить с tableView выбранные записи через SQL?
Не очень понятно, что вы имеете в виду.
Может это поможет? http://www.prog.org.ru/topic_12455_0.html
Записан
DEATH
Гость
« Ответ #2 : Июнь 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. Как получить информацию о выбранном(ых) поле. И удалить. Ну или отредактировать.
Записан
sobr_vamp
Гость
« Ответ #3 : Июнь 16, 2011, 23:52 »

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

Давайте проясним.
У вас есть QTableView и для него определена модель.
В этой модели есть строки и столбцы и их можно выделить.
Вы их хотите удалить? Те строки, которые пользователь выделил мышкой?
Если да, то приведённый код должен работать и SQL тут вообще ни при чем.
Если нет, то что тогда такое "поля"? И откуда вы их хотите удалить?
« Последнее редактирование: Июнь 17, 2011, 00:25 от sobr_vamp » Записан
DEATH
Гость
« Ответ #4 : Июнь 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();

Как то так.
Записан
DEATH
Гость
« Ответ #5 : Июнь 17, 2011, 00:06 »

Код
C++ (Qt)
int count = ui->tableView->selectionModel()->selectedRows().count();
На выходе 1, сообственно так и должно быть, выбрал 1 запись. А дальше тишина. Не удаляется ничего =(
Записан
sobr_vamp
Гость
« Ответ #6 : Июнь 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 будет всё здорово.

Но это лишь моя догадка. Пробуйте Подмигивающий
« Последнее редактирование: Июнь 17, 2011, 00:10 от sobr_vamp » Записан
DEATH
Гость
« Ответ #7 : Июнь 17, 2011, 00:14 »

1. Загоняете номера выделенных строк в какой-нибудь QList

Сообственно меня интересует как их получить? А дальше никаких проблем =)
Записан
sobr_vamp
Гость
« Ответ #8 : Июнь 17, 2011, 00:22 »

http://doc.qt.nokia.com/latest/qabstractitemview.html#selectedIndexes

Использовать как-то так:
Код:
QModelIndexList indexes = ui.tableView->selectionModel()->selection().indexes();
Записан
DEATH
Гость
« Ответ #9 : Июнь 17, 2011, 00:28 »

Я в ответ получу индексы? Индексы узнать это одно... мне нужно узнать само значение уже инфы, к примеру имя Вася. или предмет, или оценку...
Записан
sobr_vamp
Гость
« Ответ #10 : Июнь 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
Записан
DEATH
Гость
« Ответ #11 : Июнь 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();
   }

Как то так. Но ничего не получается, куча ошибок %)
Записан
DEATH
Гость
« Ответ #12 : Июнь 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 выводится нумерация строк. Её можно отрубить?
Записан
DEATH
Гость
« Ответ #13 : Июнь 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 ] уплыл рус. текст =(
« Последнее редактирование: Июнь 17, 2011, 03:45 от DEATH » Записан
pokidoff
Гость
« Ответ #14 : Июнь 17, 2011, 07:25 »

Вообще QSqlQueryModel - readOnly модель. Чтобы редактировать,удалять и вставлять строки надо пользоваться как минимум QSqlTableModel.
PS: почитай про метод QSqlTableModel::removeRows
Записан
Страниц: [1] 2   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.301 секунд. Запросов: 21.