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

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

Страниц: [1] 2   Вниз
  Печать  
Автор Тема: QSqlQueryModel ,QAbstractItemModel  (Прочитано 16414 раз)
paxerus
Гость
« : Январь 11, 2010, 10:59 »

Добрый день

У меня есть наследник от QSqlQueryModel , хотелось бы перегрузить  QAbstractItemModel и связать както её с со своим наследником.

Другими словами мне нужно в итемах QSqlQueryModel иметь доп поля,сам QSqlQueryModel я перегрузил но как теперь перегрузить итемы?

Записан
lit-uriy
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3880


Просмотр профиля WWW
« Ответ #1 : Январь 11, 2010, 11:34 »

>>Другими словами мне нужно в итемах QSqlQueryModel иметь доп поля
а точнее, что за допполя?
Записан

Юра.
paxerus
Гость
« Ответ #2 : Январь 11, 2010, 11:42 »

мне нужно как минимум ввести целочисленное(или просто bool) поле отвечает за то, будут ли по этому итему в дальнейшем вестись вычисления, менять значения в этом поле буду в методе data
в начале хотел в самом методе data записывать данные в QModelIndex &index, например методом setdata но у него нет такого в публичных, поэтому приходиться извращаться
« Последнее редактирование: Январь 11, 2010, 11:44 от paxerus » Записан
paxerus
Гость
« Ответ #3 : Январь 11, 2010, 11:47 »

если в поле присутствует значение из value_mask то значит в него нужно соотв-й статус поставить
Код:
QVariant CustomQueryModel::data(const QModelIndex &index, int role) const
{
    QVariant value = QSqlQueryModel::data(index, role);
QString sss;
QVariant ret;
if(status_mask)
{
if (role == Qt::DisplayRole && index.column() == 5)
{
if(value_mask.isValid())


if(value_mask.type() == QVariant::Type::String)
{ QStringList sss;
QRegExp reg("(.*)"+value_mask.toString()+"(.*);");
QString exp(value.toString());

if(reg.exactMatch(exp)>=0)
sss.append(reg.cap(2));

if(!sss.isEmpty())
{
  // тут чтото типа index.setdata()
}
else
{
  // тут чтото типа index.setdata()
}

}
else if (role == Qt::TextColorRole )
{
if(index.data(Qt::UserRole) == -1)
qVariantFromValue(QColor(Qt::red));
else  qVariantFromValue(QColor(Qt::green));
}
}

}

}


    return value;
}
Записан
crossly
Гость
« Ответ #4 : Январь 11, 2010, 11:52 »

а почему бы это значение не [хранить к примеру в UserRole+1
Записан
paxerus
Гость
« Ответ #5 : Январь 11, 2010, 11:59 »

а почему бы это значение не [хранить к примеру в UserRole+1

Примерчик можно?
Записан
crossly
Гость
« Ответ #6 : Январь 11, 2010, 21:04 »

а чем вам ваш же примерчик не нравится.... добавить еще метод setData и все..
Записан
paxerus
Гость
« Ответ #7 : Январь 12, 2010, 14:09 »

а чем вам ваш же примерчик не нравится.... добавить еще метод setData и все..

еслиб все было так просто то давно бы сделал.
метод QVariant   data(const QModelIndex &item, int role) const; константный и не получается из него ниче меня при компиляции дает ошибку  cannot convert 'this' pointer from 'const CustomQueryModel' to 'QObject &'
, если сделать не константным то соотв-о он не будет виртуальным
какие идеи?
« Последнее редактирование: Январь 12, 2010, 15:11 от paxerus » Записан
crossly
Гость
« Ответ #8 : Январь 12, 2010, 18:57 »

чет я вообще ниче понять не могу.... опишите подробнее в чем задача.... и причем тут виртуальность вообще??
Записан
MoPDoBoPoT
Гость
« Ответ #9 : Январь 12, 2010, 22:54 »

Менять какие-либо значения в методе data() - моветон, потому как этот метод зовется из прикрепленного к модели представления для отрисовки итема. Значит, каждый раз при отрисовки будет проверяться соответствие некой маске и перезапись старого (такого же) значения, то есть выполняется одна и та же работа.
Изменение значения этого доп. поля для итема надо производить после загрузки новых данных (переопределить setQuery(), только надо будет что-нибудь придумать для fetchMore) и после изменения значений итема (переопределить setData()), если такое подразумевается.
Замечания:
1.
Код:
QVariant CustomQueryModel::data(const QModelIndex &index, int role) const
{
    ...
if (role == Qt::DisplayRole && index.column() == 5)   // __role == Qt::DisplayRole__
{
...
if(value_mask.type() == QVariant::Type::String)
{
...
}
else if (role == Qt::TextColorRole ) //<=сюда никогда не зайдем, т.к. role = Qt::DisplayRole
{
...
}
}

}

}


    return value;
}
2. Для изменения значения члена класса в константном методе сущетсвует спецификатор mutable.
Записан
paxerus
Гость
« Ответ #10 : Январь 13, 2010, 10:34 »

чет я вообще ниче понять не могу.... опишите подробнее в чем задача.... и причем тут виртуальность вообще??
абстрагируемся от того что написано. у меня есть QSqlQueryModel, есть QTableView отображения
В возвращаемых с базы данных в одном из полей(текстового) есть есть грубо говоря ключ (например "key="),
если он присутствует в этом поле то нужно для текущей записи установить какое то признак что он присутствует(все что после нужно тоже считать в другую переменную которую  желательно тоже привязать привязать к итему) что б я потом где нить, напимер в делегате(но не обязательно в нем) от QTableView мог видеть такие записи, и например мог раскрасить их или еще что с ними сделать.
Т.е мне нужно что в итемах был признак присутствия ключа в заданном поле
Записан
Kolobok
Гость
« Ответ #11 : Январь 13, 2010, 11:45 »

А разве присутствие ключа не является признаком того, что он присутствует?
Записан
paxerus
Гость
« Ответ #12 : Январь 13, 2010, 12:57 »

А разве присутствие ключа не является признаком того, что он присутствует?
ну можно просто в текстовое поле писать и проверять его на пустоту,если нету значение.важен сам принцип
Записан
crossly
Гость
« Ответ #13 : Январь 13, 2010, 14:05 »

лан.... есть у нас метод дата.... есть у нас QSqlQuery у модели... к примеру нужное значение у нас во 2й колноке, а кеу в 4....
Код:
....
query.seek(index.row());
if(index.column()==1){
        switch(role){
              case Qt::UserRole+1:
                      return query.value(3);
              default:
                      return query.value(index.column());

        }
}else
       return query.value(index.column());

.....

это конечно грубо..... ну суть должна быть понятна.... в итоге в UserRole+1 2й колонки мы получаем твой key.... хотя зачем так делать я так и не понял.... он же в любом случае будет отражатся в 4й колонке... почему бы его оттуда не использовать...


Записан
paxerus
Гость
« Ответ #14 : Январь 13, 2010, 14:08 »

лан.... есть у нас метод дата.... есть у нас QSqlQuery у модели... к примеру нужное значение у нас во 2й колноке, а кеу в 4....
Код:
....
query.seek(index.row());
if(index.column()==1){
        switch(role){
              case Qt::UserRole+1:
                      return query.value(3);
              default:
                      return query.value(index.column());

        }
}else
       return query.value(index.column());

.....

это конечно грубо..... ну суть должна быть понятна.... в итоге в UserRole+1 2й колонки мы получаем твой key.... хотя зачем так делать я так и не понял.... он же в любом случае будет отражатся в 4й колонке... почему бы его оттуда не использовать...




Потому что колонка текстовая и парсить её я хочу на начальном этапе,а не потом где то глубоко в программе и по 100 раз, ,спасибо за метод, попробую
Записан
Страниц: [1] 2   Вверх
  Печать  
 
Перейти в:  


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