LINUX.ORG.RU

QSqlQueryModel как это должно работать?

 , ,


0

1

Есть у меня простая форма с одной кнопкой и tableView:

void MainWindow::on_pushButton_clicked()
{
    QSqlDatabase db = createConnection();

    QSqlQuery qry("select id, name from public.groups", db);
    qry.first();

    QSqlQueryModel model;
    model.setQuery(qry);

    if(model.lastError().isValid())
        qDebug() << model.lastError();


    ui->tableView->setModel(&model);
    ui->tableView->show();

    db.close();
}

Жамкаем на кнопку, пауза… и ничего не меняется. Данные в базе есть, т.к. если запихать на форму TableWidget и поместить на кнопку это:

void MainWindow::on_pushButton_clicked()
{
    for(int i = ui->tableWidget->rowCount()-1; i >= 0 ; i--)
        ui->tableWidget->removeRow(i);

    QSqlDatabase db = createConnection();

    QSqlQuery qry("select id, name from public.groups", db);
    int nId = 0;
    QString sName;

    QSqlRecord rec = qry.record();
    for(int i = 0; qry.next(); i++)
    {
            nId = qry.value(rec.indexOf("id")).toInt();
            sName = qry.value(rec.indexOf("name")).toString();

            ui->tableWidget->insertRow(i);
            ui->tableWidget->setItem(i, 0, new QTableWidgetItem(QString::number(nId)));
            ui->tableWidget->setItem(i, 1, new QTableWidgetItem(sName));
    }
    ui->tableWidget->resizeColumnsToContents();

    db.close();
}

то увидим это, т.е. данные есть. Как правильно готовить модель-представление?

★★★★★

Первое, что бросилось в глаза — вызов db.close() сразу после show(). В варианте с виджетом ты всё заполнил данными, и БД больше не нужна. Про Model-View я так не уверен.

Ой, да и время жизни самой модели у тебя внутри обработчика.

Сделай БД, модель и запрос полями формы, и для начала инициализируй в конструкторе, а удаляй в деструкторе, посмотри, что изменится. Это решение не для продакшена, но так ты по крайней мере поймёшь, верна ли догадка.

hobbit ★★★★★ ()

QSqlRecord rec = qry.record();

Не уверен зачем это нужно. Достаточно QSqlQuery::next и QSqlQuery::value

RazrFalcon ★★★★★ ()
Ответ на: комментарий от RazrFalcon

Ага. А вопрос именно по первому.

Но надо проверять, конечно.

hobbit ★★★★★ ()

ui->tableView->setModel(&model);

Передача указателя на объект со стека. Молодца! Любишь фантомные краши?

ox55ff ★★★★★ ()
Ответ на: комментарий от tiinn

У Шлее точно локальный указатель присваивался полю класса? Что-то сомневаюсь.

Мой совет — см. выше.

hobbit ★★★★★ ()
Ответ на: комментарий от tiinn

Сейчас глянул — у него вообще всё запихнуто в функцию main(), чисто учебный пример. И там, естественно, ничего не уничтожится, пока app.exec() не отработает.

У тебя — по-другому. У тебя QTableView, принадлежащий окну, созданному, судя по ui->… в дизайнере. Соответственно, обеспечь, чтобы и модель была жива, пока с view работа идёт. Как — я написал выше. Задействуй конструктор и деструктор своего MainWindow.

hobbit ★★★★★ ()
Последнее исправление: hobbit (всего исправлений: 1)
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.