Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: QTableView и QSqlTableModel в разных классах
Форум на CrossPlatform.RU > Библиотеки > Qt > Qt Модель/Представление
Necros
Хочу сделать отдельный класс для работы с базой, но у меня возникает ошибка, если я в ui->tableView->setModel(); передаю модель созданную в другом классе. Если Создаю ее в этом же классе, то все работает хорошо, но хочется весь SQL утащить в отдельный класс и сделать методы для доступа к базе.

Фрагмент установки модели:
void Settings::setModel()
{
    dao = DAO();
    ui->tableView->setModel(dao.getModel());
}


dao.h
class DAO
{
public:
    DAO();
    ~DAO();
   void AddToBase(QString title, QString source, QString base);
   QSqlTableModel getModel();
private:
   QSqlDatabase db;
   QSqlTableModel *model;

};


dao.cpp
QSqlTableModel DAO::getModel()
{
    if(QSqlDatabase::contains(QSqlDatabase::defaultConnection)) {
        db = QSqlDatabase::database();
    } else {
        db = QSqlDatabase::addDatabase("QSQLITE");
        db.setDatabaseName("d:\\db.db3");
    }

    model = new QSqlTableModel();
    model->setTable("databases");
    model->setEditStrategy(QSqlTableModel::OnFieldChange);
    model->select();
    model->setHeaderData(0, Qt::Horizontal, QObject::tr("ID"));
    model->setHeaderData(1, Qt::Horizontal, QObject::tr("Заголовок"));
    model->setHeaderData(2, Qt::Horizontal, QObject::tr("Источник"));
    model->setHeaderData(3, Qt::Horizontal, QObject::tr("База"));
    return model;
}


Ошибки:
D:\dev\untitled1-build-desktop-Qt_4_8_0_for_Desktop_-_MinGW__Qt_SDK_________\..\untitled1\settings.cpp:-1: In member function 'void Settings::setModel()':
D:\dev\untitled1-build-desktop-Qt_4_8_0_for_Desktop_-_MinGW__Qt_SDK_________\..\untitled1\settings.cpp:24: ошибка: no matching function for call to 'QTableView::setModel(QSqlTableModel)'
D:\dev\untitled1-build-desktop-Qt_4_8_0_for_Desktop_-_MinGW__Qt_SDK_________\..\..\QtSDK\Desktop\Qt\4.8.0\mingw\include\QtGui\qtableview.h:71:
candidates are: virtual void QTableView::setModel(QAbstractItemModel*)


Я пробовал уже и QAbstractItemModel Делать и создавать модель на месте и ей присваивать возвращаемую модель. Подскажите, пожалуйста в чем ошибка, уж больно не хочется страшный копипаст делать в каждом методе.
xu-user
Функция setModel требует указатель на модель. А ваша функция QSqlTableModel DAO::getModel() возвращает объект модели, а не указатель на её. Измените возвращаемое значение на QSqlTableModel*, должно работать.
silver47
Более того, хочу отметить, что при выходе из void Settings::setModel() Ваша модель будет уничтожена, вместе с объектом dao. (если быть точным, то не будет уничтожена, но выпадет из поля видимости, и Вы сможете получить вылет программы в совсем неожиданном месте.)
Necros
Не подскажете как можно от этого спастись?
Litkevich Yuriy
Necros,
Цитата(silver47 @ 16.3.2012, 10:27) *
при выходе из void Settings::setModel() Ваша модель будет уничтожена, вместе с объектом dao. (если быть точным, то не будет уничтожена, но выпадет из поля видимости, и Вы сможете получить вылет программы в совсем неожиданном месте.)
такого не должно произойти, т.к. модель, созданная динамически, будет себе жить поживать. А с помощью:
ui->tableView->model()
можно будет получить и указатель на неё.

Однако, что верно, то верно:
Цитата
{
dao = DAO();
ui->tableView->setModel(dao.getModel());
}
объект dao использован только для получения модели, а нужен ли для этого целый класс?
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Форум IP.Board © 2001-2024 IPS, Inc.