Russian Qt Forum
Ноябрь 24, 2024, 13:28 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: [QSqlQueryModel] создание потомка  (Прочитано 5873 раз)
Troglodit
Гость
« : Сентябрь 04, 2010, 08:47 »

Qt 4.6.3

Создаю потомка QSqlQueryModel

qsqlmyquerymodel.h
Код:
#ifndef QSQLMYQUERYMODEL_H
#define QSQLMYQUERYMODEL_H

#include <QtSql/QSqlQueryModel>
#include <QtSql/QSqlDatabase>
#include <QObject>

class QSqlMyQueryModelPrivate;

class QSqlMyQueryModel : public QSqlQueryModel
{
    Q_OBJECT
    Q_DECLARE_PRIVATE(QSqlMyQueryModel)

public:
    explicit QSqlMyQueryModel(QObject *parent = 0, QSqlDatabase db = QSqlDatabase());
    virtual ~QSqlMyQueryModel();
protected:
    QSqlMyQueryModel(QSqlMyQueryModelPrivate &dd, QObject *parent = 0, QSqlDatabase db = QSqlDatabase());

};

#endif // QSQLMYQUERYMODEL_H

qsqlmyquerymodel.cpp
Код:
#include "qsqlmyquerymodel.h"
#include "qsqlmyquerymodel_p.h"

QSqlMyQueryModel::QSqlMyQueryModel(QObject *parent, QSqlDatabase db)
    : QSqlQueryModel(*new QSqlMyQueryModelPrivate, parent)
{
    Q_D(QSqlMyQueryModel);
    d->db = db.isValid() ? db : QSqlDatabase::database();
}


QSqlMyQueryModel::QSqlMyQueryModel(QSqlMyQueryModelPrivate &dd, QObject *parent, QSqlDatabase db)
    : QSqlQueryModel(dd, parent)
{
    Q_D(QSqlMyQueryModel);
    d->db = db.isValid() ? db : QSqlDatabase::database();
}
void QSqlMyQueryModelPrivate::clear()
{

}

qsqlmyquerymodel_p.h
Код:
#ifndef QSQLMYQUERYMODEL_P_H
#define QSQLMYQUERYMODEL_P_H
#include <QtCore/QMap>
#include <QtSql/private/qsqlquerymodel_p.h>

class QSqlMyQueryModelPrivate : public QSqlQueryModelPrivate
{
    Q_DECLARE_PUBLIC(QSqlMyQueryModel)
public:
    QSqlMyQueryModelPrivate(){};
    QSqlDatabase db;
    void clear();
};


#endif // QSQLMYQUERYMODEL_P_H

при компиляции появляются следующие ошибки

Код:
debug/qsqlmyquerymodel.o:qsqlmyquerymodel.cpp:(.text$_ZN21QSqlQueryModelPrivateC2Ev[QSqlQueryModelPrivate::QSqlQueryModelPrivate()]+0x18): 
undefined reference to `vtable for QSqlQueryModelPrivate'
debug/qsqlmyquerymodel.o:qsqlmyquerymodel.cpp:(.text$_ZN23QSqlMyQueryModelPrivateC1Ev[QSqlMyQueryModelPrivate::QSqlMyQueryModelPrivate()]+0x3b):
undefined reference to `QSqlQueryModelPrivate::~QSqlQueryModelPrivate()'
debug/qsqlmyquerymodel.o:qsqlmyquerymodel.cpp:(.text$_ZN23QSqlMyQueryModelPrivateD1Ev[QSqlMyQueryModelPrivate::~QSqlMyQueryModelPrivate()]+0x2a):
undefined reference to `QSqlQueryModelPrivate::~QSqlQueryModelPrivate()'
debug/qsqlmyquerymodel.o:qsqlmyquerymodel.cpp:(.text$_ZN23QSqlMyQueryModelPrivateD1Ev[QSqlMyQueryModelPrivate::~QSqlMyQueryModelPrivate()]+0x44):
undefined reference to `QSqlQueryModelPrivate::~QSqlQueryModelPrivate()'
debug/qsqlmyquerymodel.o:qsqlmyquerymodel.cpp:(.text$_ZN23QSqlMyQueryModelPrivateD0Ev[QSqlMyQueryModelPrivate::~QSqlMyQueryModelPrivate()]+0x2a):
undefined reference to `QSqlQueryModelPrivate::~QSqlQueryModelPrivate()'
debug/qsqlmyquerymodel.o:qsqlmyquerymodel.cpp:(.text$_ZN23QSqlMyQueryModelPrivateD0Ev[QSqlMyQueryModelPrivate::~QSqlMyQueryModelPrivate()]+0x44): undefined reference to `QSqlQueryModelPrivate::~QSqlQueryModelPrivate()'
debug/moc_qsqlmyquerymodel.o:moc_qsqlmyquerymodel.cpp:(.rdata$_ZTV16QSqlMyQueryModel[vtable for QSqlMyQueryModel]+0x14): undefined reference to `QSqlMyQueryModel::~QSqlMyQueryModel()'
debug/moc_qsqlmyquerymodel.o:moc_qsqlmyquerymodel.cpp:(.rdata$_ZTV16QSqlMyQueryModel[vtable for QSqlMyQueryModel]+0x18): undefined reference to `QSqlMyQueryModel::~QSqlMyQueryModel()'
collect2: ld returned 1 exit status
mingw32-make[1]: *** [debug\Test.exe] Error 1
mingw32-make: *** [debug] Error 2

В чем моя ошибка?
Записан
crossly
Гость
« Ответ #1 : Сентябрь 06, 2010, 14:40 »

а для чего потребовался  QSqlQueryModelPrivate??
Записан
Troglodit
Гость
« Ответ #2 : Сентябрь 06, 2010, 16:52 »

Мне необходима редактируемая модель, но не табличная. У троллей этого нет. QSqlQueryModel дефакто только для чтения, пример в демках - это ужас. Вот я и решил добавить функционал QSqlTableModel, но не только не для таблицы,а для набора данных.
Даже если взять отдельно взятую таблицу, то в  QSqlTableModel я не могу назначить процедуру на вставку/изменение/удаление данных, юзеру не всегда дают разрешение на изменение таблиц напрямую в БД. Вроде бы это стандартный qt-шный шаблон по написанию подобных классов, но в чем-то проблема. Мои приватные и обычные классы созданные по данному шаблону , создаются и компилятся без проблем.
Записан
crossly
Гость
« Ответ #3 : Сентябрь 06, 2010, 19:33 »

для того что бы сделать модель редактируемой нужно переопределить всего 2 метода.... http://doc.trolltech.com/4.7-snapshot/model-view-programming.html#making-the-model-editable а приват классы они для того и приват что бы их никто не трогал...
Записан
Troglodit
Гость
« Ответ #4 : Сентябрь 06, 2010, 20:42 »

Вы пробовали писать реальное приложение с этой моделью? Нет кэша, для каждого запроса фактически писать свой класс, при рефреше теряется фокус. В QSqlTableModel такого нет. Приватный класс использутся по идеалогии qt(например QSqlTableModelPrivat наследуется от QSqlQueryModelPrivat). Посмотрите шаблон pimple (если не ошибаюсь).Я хотел сделать в qt -ном стиле, но не получается.
Записан
crossly
Гость
« Ответ #5 : Сентябрь 06, 2010, 20:46 »

пробовал... и кэш сам делал... ничего сложного там нет... а идеология Qt гласит, то приват классы только для внутренних целей... и использовать их крайне не рекомендуется....
Записан
Troglodit
Гость
« Ответ #6 : Сентябрь 06, 2010, 22:38 »

Значит я не правильно понял.
А насчет функционала, не расскажешь (примерно) как сделал?Как в QSqlTableModel или по-своему?
просто я еще ньюб, только разбираюсь.
Записан
crossly
Гость
« Ответ #7 : Сентябрь 07, 2010, 09:19 »

а что по функционалу.... смотри что тебе нужно ... и добавляй по тиху... если хош кэш, то советую подсмотреть в tablemodel... там не так сложно..
Записан
Troglodit
Гость
« Ответ #8 : Сентябрь 07, 2010, 09:40 »

спасибо за ответы. я так и сделаю.
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.067 секунд. Запросов: 21.