Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: [РЕШЕНО] QTableView + QSqlTableModel, Удаление данных
Форум на CrossPlatform.RU > Библиотеки > Qt > Qt Разработка баз данных
VBA
Использую QSqlTableModel и QTableView в связке с PyQt4, для отображения данных из таблицы БД.

...
Model = QSqlTableModel(self)
Model.setTable("test")
Model.setEditStrategy(QSqlTableModel.OnManualSubmit)
Model.select()
...
TableView = QTableView(self)
TableView.setModel(Model)
...


Пытаюсь удалить строку, которую выбрал пользователь в TableView, таким образом:
Index = TableView.currentIndex()
TableView.model().removeRow(Index.row())
TableView.model().submitAll()


В результате получаю ошибку:
QSqlQuery::value: not positioned on a valid record

Причем, TableView.model().removeRow(Index.row()) возвращает True, а "затык" происходит на TableView.model().submitAll() (возвращает False).

ТableView.model().lastError().text() пишет следующее:
No data supplied for parameters in prepared statement QMYSQL3: Unable to execute statement

Добавление записей происходит без проблем, а вот удаление... (((
Litkevich Yuriy
я так делал (C++):
// Удаляем строку
void TableEditor::SlotDel()
{
  int row;
  QItemSelectionModel    *selectModel;
  QModelIndexList         indexes;
  QModelIndex             index;
  
    // Узнаем выделенную строку
    selectModel = view->selectionModel();
    indexes = selectModel->selectedIndexes();
    
    foreach(index, indexes)
    {
        QString str;
        row = index.row();
        if (!model->removeRows(row,1))
        {
            str = model->lastError().text();
            qDebug() << str << "\n\r";
            break;
        }
        else
        {
            view->setRowHidden(row, true);
        }
    }
    SlotChange();
    SlotClick();
    
}
VBA
Цитата(Litkevich Yuriy @ 13.1.2009, 17:29) *
я так делал (C++):
...

Так это получается удаляються только строки из QTableView, а из самой таблицы БД нет.
Мне надо, чтобы удалялись записи из самой БД, физически, если можно так назвать.
Litkevich Yuriy
Цитата(VBA @ 13.1.2009, 21:50) *
Так это получается удаляються только строки из QTableView, а из самой таблицы БД нет.
Мне надо, чтобы удалялись записи из самой БД, физически, если можно так назвать.
да в приведенном примере нет подтверждения действия так как у меня на это отдельная кнопочка. Но я пока вижу разницу только в методах:
у тебя removeRow(...), а уменя removeRows(...)
может быть в этом дело?

а подверждаю так:
void TableEditor::SlotSubmit()
{
    model->database().transaction();
    if (model->submitAll())
    {
        model->database().commit();
        model->select();
        // Опять применить и отмена не активны
        BtnDis();    
    }
    else
    {
        model->database().rollback();
        QMessageBox::critical(this, tr("Ошибка"),
                             tr("Сообщение БД:\r\n %1")
                             .arg(model->lastError().databaseText()));
    }
}
VBA
Цитата(Litkevich Yuriy @ 13.1.2009, 17:54) *
Но я пока вижу разницу только в методах:
у тебя removeRow(...), а уменя removeRows(...)
может быть в этом дело?

Переделал твой код в "питоновский"... результат тот же, при вызове submitAll() получаю:
QSqlQuery::value: not positioned on a valid record
Litkevich Yuriy
Хм. Даже не знаю в чем может быть проблема, я проверял только с двумя БД SQLite и FireBird. А это не может быть багом именно PyQt? (что-то не до конца реализовано)
VBA
Уф... заработало... :)

У меня в таблице БД первое поле - это ID записи. Соответственно, я его пытался не отображать в QTableView. Согласно офф. доке http://doc.trolltech.com/4.4/qsqltablemodel.html#details я написал:
Model.removeColumn(0)

Поле стало невидимым, но вылезли вот такие непонятные проблемы (кстати, до сих пор не пойму их суть).

Закоментировал эту строку и все чудом заработало.
Поле (а точнее уже столбец) скрываю не в модели, а в вьювере:
TableView.setColumnHidden(0, True)
Litkevich Yuriy
Цитата(VBA @ 14.1.2009, 3:21) *
Поле (а точнее уже столбец) скрываю не в модели, а в вьювере:
угу, сюда еще глянь
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Форум IP.Board © 2001-2024 IPS, Inc.