crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )

 
Ответить в данную темуНачать новую тему
> QTableView и QSqlTableModel в разных классах
Necros
  опции профиля:
сообщение 14.3.2012, 9:32
Сообщение #1


Новичок


Группа: Новичок
Сообщений: 6
Регистрация: 14.3.2012
Пользователь №: 3262

Спасибо сказали: 0 раз(а)




Репутация:   0  


Хочу сделать отдельный класс для работы с базой, но у меня возникает ошибка, если я в 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
  опции профиля:
сообщение 14.3.2012, 10:09
Сообщение #2


Студент
*

Группа: Новичок
Сообщений: 18
Регистрация: 22.6.2011
Пользователь №: 2761

Спасибо сказали: 0 раз(а)




Репутация:   0  


Функция setModel требует указатель на модель. А ваша функция QSqlTableModel DAO::getModel() возвращает объект модели, а не указатель на её. Измените возвращаемое значение на QSqlTableModel*, должно работать.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
silver47
  опции профиля:
сообщение 16.3.2012, 8:27
Сообщение #3


Активный участник
***

Группа: Участник
Сообщений: 356
Регистрация: 1.4.2010
Пользователь №: 1584

Спасибо сказали: 40 раз(а)




Репутация:   6  


Более того, хочу отметить, что при выходе из void Settings::setModel() Ваша модель будет уничтожена, вместе с объектом dao. (если быть точным, то не будет уничтожена, но выпадет из поля видимости, и Вы сможете получить вылет программы в совсем неожиданном месте.)
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Necros
  опции профиля:
сообщение 19.3.2012, 9:06
Сообщение #4


Новичок


Группа: Новичок
Сообщений: 6
Регистрация: 14.3.2012
Пользователь №: 3262

Спасибо сказали: 0 раз(а)




Репутация:   0  


Не подскажете как можно от этого спастись?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 19.3.2012, 18:50
Сообщение #5


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9669
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

Спасибо сказали: 807 раз(а)




Репутация:   94  


Necros,
Цитата(silver47 @ 16.3.2012, 10:27) *
при выходе из void Settings::setModel() Ваша модель будет уничтожена, вместе с объектом dao. (если быть точным, то не будет уничтожена, но выпадет из поля видимости, и Вы сможете получить вылет программы в совсем неожиданном месте.)
такого не должно произойти, т.к. модель, созданная динамически, будет себе жить поживать. А с помощью:
ui->tableView->model()
можно будет получить и указатель на неё.

Однако, что верно, то верно:
Цитата
{
dao = DAO();
ui->tableView->setModel(dao.getModel());
}
объект dao использован только для получения модели, а нужен ли для этого целый класс?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

Быстрый ответОтветить в данную темуНачать новую тему
Теги
Нет тегов для показа


1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0




RSS Текстовая версия Сейчас: 29.11.2024, 8:16