Russian Qt Forum

Qt => Базы данных => Тема начата: demal от Декабрь 06, 2012, 21:38



Название: Странное поведение QSqlTableModel + TableView
Отправлено: demal от Декабрь 06, 2012, 21:38
Столкнулся с такой бедой. Ниже приведенный код удаляет в одной модели и таблице, а на другой связке говорит что индекс строки неверен.
void LSostav::on_toolButton_26_clicked()
{
    if(ui->ListDelo->currentIndex().isValid())
    {
        int ret = QMessageBox::warning(this, tr("Внимание"),
                                       tr("Данная операция удалит запись из базы данных. Продолжить?"),
                                       QMessageBox::Yes | QMessageBox::No,
                                       QMessageBox::No);
        qDebug()<<ret;
        if(ret==QMessageBox::Yes){
        model_list->removeRow(ui->ListDelo->currentIndex().row()); //а вот тут и засада
}
}}

модели нигде не пересекаются и вьюхи разные. Т.е. один и тот же код в разных слотах работает по разному :-[
Что я делаю не так?


Название: Re: Странное поведение QSqlTableModel + TableView
Отправлено: kambala от Декабрь 06, 2012, 21:57
можно начать с того, что сохранять ui->ListDelo->currentIndex() перед ифом (или в самом условии ифа)


Название: Re: Странное поведение QSqlTableModel + TableView
Отправлено: demal от Декабрь 06, 2012, 22:11
А что это принципиально поменяет?


Название: Re: Странное поведение QSqlTableModel + TableView
Отправлено: kambala от Декабрь 06, 2012, 22:22
всякое может быть, попробовать стоит. больше ничего при таком количестве кода сказать невозможно.


Название: Re: Странное поведение QSqlTableModel + TableView
Отправлено: lit-uriy от Декабрь 07, 2012, 09:49
demal, в коде у тебя нюанс - после того как окошко с вопросом пользователю показалось, фокус уходит со списка.
Это может приводить к тому, что текущей строки в списке больше нет, поэтому запоминай номер строки и затем по номеру строки удаляй.


Название: Re: Странное поведение QSqlTableModel + TableView
Отправлено: LEO от Декабрь 07, 2012, 16:26
Код:
QModelIndex index = ui->tableView->currentIndex();
    if (!index.isValid())
        return;
    int k = QMessageBox::warning(this, tr("Блааа"),
                                 tr("Бла, бла?"),
                                 QMessageBox::Yes | QMessageBox::No);
    if (k == QMessageBox::No)

    {
        return;
    }

    model->removeRow(index.row());
    model->submitAll();
Делал так, работает


Название: Re: Странное поведение QSqlTableModel + TableView
Отправлено: demal от Декабрь 08, 2012, 12:08
секрет оказался прост. :) Причина не работы кода в одном из случаев - заполнение базы. Если модель через setData добавляет строки, но количество заносимых значений меньше чем столбцов в таблице, то удаление потом на этих строках работать не будет. При этом отображаться будет так, как-будто все поля вводятся. Вот так вот  :-\.


Название: Re: Странное поведение QSqlTableModel + TableView
Отправлено: GreatSnake от Декабрь 08, 2012, 13:18
demal, в коде у тебя нюанс - после того как окошко с вопросом пользователю показалось, фокус уходит со списка.
Это может приводить к тому, что текущей строки в списке больше нет, поэтому запоминай номер строки и затем по номеру строки удаляй.
Никак это не может приводить к этому)