Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: SQLite, TableModel и QueryModel
Форум на CrossPlatform.RU > Библиотеки > Qt > Qt Модель/Представление
Lassaaire
Всем привет.

Недавно начал изучать Qt, в частности, взаимодействие с БД. Есть такой код:

#include "myclass.h"
#include <QtGui/QApplication>
#include <QtSql>
#include <QTableView>
MyClass::MyClass(QWidget *parent, Qt::WFlags flags): QMainWindow(parent, flags)
{
    ui.setupUi(this);
    QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE");
    db.setDatabaseName("stf.db");

    QSqlQueryModel* qmodel = new QSqlQueryModel;
    QSqlQuery* query = new QSqlQuery;
    query->prepare("SELECT * FROM table_name");//Что-то не то. Я что, sql забыл?
    query->exec();
    qmodel->setQuery(*query);
    ui.tv1->setModel(qmodel);

    QSqlTableModel* tmodel = new QSqlTableModel;
    tmodel->setTable("table_name");
    tmodel->select();
    tmodel->setEditStrategy(QSqlTableModel::OnFieldChange);
    ui.tv2->setModel(tmodel);
}


Две таблички, база, выдёргиваем из базы данные и выводим в таблички. Казалось бы, примитив. Да и кода-то кот наплакал. Однако если табличка с TableModel работает отлично, то QueryModel выдаёт гнетущую пустоту. То ли селект пустой, то ли квери не срабатывает, не могу понять. Пробовал прямым запросом, без prepare. Пробовал даже без QSqlQuery-объекта, напрямую в exec() запрос класть. Хоть бы что.

Может, кто сталкивался? Нужна помощь.
Lassaaire
Виноват, поспешил с созданием темы.
помогла замена
QSqlQueryModel* qmodel = new QSqlQueryModel;

на
QSqlQueryModel* qmodel = dynamic_cast<QSqlQueryModel*>(tmodel);


Осталось понять, что это, почему и как работает.

Снова поспешил. Не помогла.
И почему нельзя редактировать сообщения?..
Lassaaire
exec() возвращает false.

Да тут ошибаться-то негде!
Lassaaire
exec() возвращает false ВООБЩЕ на любой запрос, даже представление не создать.
Значит, я не забыл SQL, а косяк где-то в коде.
ahalaj
Цитата(Lassaaire @ 23.10.2014, 18:03) *
exec() возвращает false ВООБЩЕ на любой запрос, даже представление не создать.
Значит, я не забыл SQL, а косяк где-то в коде.

А вызвать в случае false lastError() и посмотреть что он покажет, какая конкретно ошибка?
Lassaaire
Я балбес. Забыл сделать db.open();

#include "myclass.h"
#include <QtGui/QApplication>
#include <QtSql>
#include <QTableView>
MyClass::MyClass(QWidget *parent, Qt::WFlags flags): QMainWindow(parent, flags)
{
    ui.setupUi(this);
    QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE");
    db.setDatabaseName("stf.db");
    QSqlQuery* query = new QSqlQuery(db);
    QSqlQueryModel* qmodel = new QSqlQueryModel;

    db.open();

    *query = db.exec("SELECT id, id2, name, icon FROM table_name");



    qmodel->setQuery(*query);
    ui.tv1->setModel(qmodel);

    QSqlTableModel* tmodel = new QSqlTableModel;
    tmodel->setTable("table_name");
    tmodel->select();
    tmodel->setEditStrategy(QSqlTableModel::OnFieldChange);
    ui.tv2->setModel(tmodel);
}


Так - работает.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Форум IP.Board © 2001-2024 IPS, Inc.