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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: Сортировка в QTableView и последующее удаление строк  (Прочитано 8576 раз)
SLIP
Гость
« : Декабрь 11, 2008, 01:23 »

Подскажите как правильно реализовать сабж?

На данный момент пришлось отключить сортировку. Потому что удаление работало некорректно (реализовано с помощью кнопочки удалить с которой связан слот в котором используется модель с EditStrategy OnManualSubmit). Да, в тэйблвью используется модель с EditStrategy OnFieldChange.

По сути получается что в слоте удаления нет ни какой инфы о том как там сейчас отсортированы строки и оно всегда думает что по айдишнику.

Для примера код этого амого слота:

Код:
void MainWindow::removeCustomer() {
    QSqlTableModel *model = new QSqlTableModel;

    model->setTable("customers");
    model->setEditStrategy(QSqlTableModel::OnManualSubmit);
    model->select();

    QItemSelectionModel *selectionModel = ui.tableView->selectionModel();
    QModelIndexList indices = selectionModel->selectedRows();
    QModelIndex index;

    int rowcount = 0;

    foreach(index, indices) {
            int row = index.row();
            model->removeRows(row, 1, QModelIndex());
            qDebug() << "Gonna remove row:" << row << "with index - " <<  model->data(index);
            rowcount++;
    }

    if (rowcount>0) {
        if (model->submitAll()) {
            qDebug() << "Customers db updated successfully!";
        } else {
            qDebug() << "Error updating customers db:" << model->lastError();
        }
        } else {
            //TODO: Add Warning here "Nothing to delete!"
            qDebug() << "Nothing to delete!";
        }

    customers();
}
Записан
shade-khv
Гость
« Ответ #1 : Декабрь 11, 2008, 03:30 »

Сломал моск... Я не дока в Qt, но так, навскидку:

Зачем вы создаете  QSqlTableModel *model = new QSqlTableModel? Это же "совсем другой человек" и она естественно не знает ничего о ваших сортировках. Почему бы не взять модель ui.tableView->model(); ?

Код
C++ (Qt)
void MainWindow::removeCustomer() {
   QModelIndex index;  int rowcount = 0;
 
   foreach(index, ui.tableView->selectionModel()->selectedRows()) {
           int row = index.row();
           ui.tableView->model()->removeRow(index.row());
           qDebug() << "Gonna remove row:" << row << "with index - " <<  model->data(index);
           rowcount++;
   }
 
   if (rowcount>0) {
       if (model->submitAll()) {
           qDebug() << "Customers db updated successfully!";
       } else {
           qDebug() << "Error updating customers db:" << model->lastError();
       }
       } else {
           //TODO: Add Warning here "Nothing to delete!"
           qDebug() << "Nothing to delete!";
       }
 
   customers();
}
« Последнее редактирование: Декабрь 11, 2008, 03:39 от shade-khv » Записан
SLIP
Гость
« Ответ #2 : Декабрь 12, 2008, 02:15 »

Да, действительно туплю. Но тогда как правильно в приведенном Вами примере сделать saveAll() ? Я имею в виду без объявления модели...
Записан
shade-khv
Гость
« Ответ #3 : Декабрь 12, 2008, 02:59 »

Вы имеете ввиду submitAll()? Просто везде где у вас model меняйте на ui.tableView->model()
Зачем вы новую модель то создавали? Модель у вас есть (ну где то же хранятся данные, которые во вьюхе отображаются), указатель на нее можно получить через ui.tableView->model()

Код
C++ (Qt)
void MainWindow::removeCustomer() {
   QModelIndex index;  int rowcount = 0;
 
   foreach(index, ui.tableView->selectionModel()->selectedRows()) {
           int row = index.row();
           ui.tableView->model()->removeRow(index.row());
           qDebug() << "Gonna remove row:" << row << "with index - " << ui.tableView->model()->data(index);
           rowcount++;
   }
 
   if (rowcount>0) {
       if (ui.tableView->model()->submitAll()) {
           qDebug() << "Customers db updated successfully!";
       } else {
           qDebug() << "Error updating customers db:" <<ui.tableView->model()->lastError();
       }
       } else {
           //TODO: Add Warning here "Nothing to delete!"
           qDebug() << "Nothing to delete!";
       }
 
   customers();
}
« Последнее редактирование: Декабрь 12, 2008, 03:02 от shade-khv » Записан
SLIP
Гость
« Ответ #4 : Декабрь 12, 2008, 10:11 »

Вы имеете ввиду submitAll()? Просто везде где у вас model меняйте на ui.tableView->model()
Зачем вы новую модель то создавали? Модель у вас есть (ну где то же хранятся данные, которые во вьюхе отображаются), указатель на нее можно получить через ui.tableView->model()

Да, сорри, писал в спешке ночью. Свою ошибку с созданием второй модели я уже понял. Но проблема в том, что на конструкцию ui.tableView->model()->submitAll() компилятор ругается...
Записан
shade-khv
Гость
« Ответ #5 : Декабрь 12, 2008, 10:32 »

Во первых, когда компилятор ругается, то он ругается какими то конкретными словами. Хотелось бы это слова знать.
Но вообще, используя телепатию, предполагаю что model() возвращает ссылку на QAbstractItemModel, а submitAll () это метод QSqlTableModel. Поскольку мы точно знаем что используется QSqlTableModel, то явно преобразуем:

QSqlTableModel * tmp_model = (QSqlTableModel*)(ui.tableView->model());
tmp_model->submitAll();

Либо так (для краткости): (QSqlTableModel*)(ui.tableView->model())->submitAll();

А вообще сделайте проект в Креэйторе и приложите, а то так можно долго править по мелочи.
Записан
SLIP
Гость
« Ответ #6 : Декабрь 12, 2008, 15:51 »

Огромное спасибо. Ваши догадки по поводу ругательства были верны. Вечером попробую предложенное решение. Проект есть. Если будут дальнейшие вопросы - залью его.
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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