crossplatform.ru

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

> как запросить у модели инф об элементе при переопределении метода data модели
Steklova Olga
  опции профиля:
сообщение 3.4.2012, 19:04
Сообщение #1


Участник
**

Группа: Участник
Сообщений: 198
Регистрация: 27.9.2011
Из: Санкт-Петербург
Пользователь №: 2912

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




Репутация:   4  


Привет! :wink2:
В моей модели переопределены две роли элементов. При переопределении одной роли элемента модели мне надо использовать информацию о другой роли этого элемента.
А именно, для одной из колонок модели цвет текста элемента модели должен быть красным, если значение соотв. поля в соотв. записи таблицы БД равно 1.
К тому же, отображение значения этого поля тоже должно быть переопределено (если значение соотв. поля в соотв. записи таблицы БД равно 1, то вместо 1 надо отобразить ВАЖНЫЙ, иначе надо отобразить ОБЫЧНЫЙ).

В справке сказано B), что мы можем запросить у модели информацию об элементе,
передав ей модельный индекс, соответствующий элементу,
и задав роль для получения данных желаемого типа:
QVariant value = model->data(index, role);

Но мне нужно сделать это при переопределении метода data модели.

Вот мой код:
MyModel_msg_list::MyModel_msg_list(QObject *parent) :
    QSqlRelationalTableModel(parent)
{
}

QVariant MyModel_msg_list::data(
        const QModelIndex &index,
        int role) const {

    QVariant value = QSqlRelationalTableModel::data(index, role);

    //можно тут так сделать?
    QVariant valueForDisplayRole = QSqlRelationalTableModel::data(index, Qt::DisplayRole); //?
    //или так? (что то же самое)
    //QVariant valueForDisplayRole = QSqlRelationalTableModel::data(index); //?

    switch (role) {

    case Qt::DisplayRole:
        if (index.column() == T_MSG_ColNmb_MSG_PRIOR_CODE)
            return value.toInt() == 1 ? "ВАЖНЫЙ" : "ОБЫЧНЫЙ";
        return value;

    case Qt::ForegroundRole:
        if ((index.column() == T_MSG_ColNmb_MSG_PRIOR_CODE) &&

            //можно тут так сделать?
            (valueForDisplayRole.toInt() == 1)) //"ВАЖНЫЙ"

            return qVariantFromValue(QColor(Qt::red));
        return value;

    } //switch (role)

    return value;
}

А вот что я не понимаю: :unknown:
1. Метод data, который я переопределяю, вызывается для каждой из ролей, которые вообще существуют для модели?
2. Порядок вызова метода data для ролей одного и того же элемента модели - непредсказуем?
3. При переопределении метода data
можно писать:
QVariant value = QSqlRelationalTableModel::data(index, role);
но можно ли писать так:
QVariant valueForDisplayRole = QSqlRelationalTableModel::data(index, Qt::DisplayRole); //?
или так (что то же самое):
QVariant valueForDisplayRole = QSqlRelationalTableModel::data(index); //?
4. Можно ли при переопределении роли Qt::ForegroundRole проверять равенство (valueForDisplayRole.toInt() == 1) ?
Совсем глупый вопрос: на это не влияет то, что при переопределении роли case Qt::DisplayRole я заменила отображение 1 на "ВАЖНЫЙ"?

Спасибо за внимание :D
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
 
Начать новую тему
Ответов
Steklova Olga
  опции профиля:
сообщение 5.4.2012, 19:14
Сообщение #2


Участник
**

Группа: Участник
Сообщений: 198
Регистрация: 27.9.2011
Из: Санкт-Петербург
Пользователь №: 2912

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




Репутация:   4  


Юрий, извините, но я не поняла следующее.
Я задала первый вопрос:
Цитата(Steklova Olga @ 3.4.2012 @ 23:33)
Правильно ли я понимаю, что в методе data наследуемой модели, независимо от того, для какой роли он сейчас был вызван, можно запросить у базовой модели данные не только для этой роли, а вообще для любой роли?
Вы ответили:
Цитата(Litkevich Yuriy @ 4.4.2012 @ 11:22)
ну да. Ты же можешь передать в метод базового класса любое значение аргумента.

Затем я задала второй вопрос:
Цитата(Steklova Olga @ 3.4.2012 @ 23:33)
Можно рассчитывать на то, что в базовой модели всегда определены данные для любой роли?
Вы ответили:
Цитата(Litkevich Yuriy @ 4.4.2012 @ 11:22)
нет, к сожалению троли поленились. Если заглянешь в исходники то увидишь, что кроме Qt::DisplayRole и Qt::EditRole ничего не обрабатывается.

Где не обрабатывается? Когда? В какую папку, в какой файл, в какой метод заглянуть, чтобы это увидеть? Чем отличается обработка ролей Qt::DisplayRole и Qt::EditRole от других?
А то ведь я в этих вопросах спрашивала одно и то же, но разными словами, а получила два противоположных ответа: "да" и "нет". Почему на второй вопрос ответ "нет"?
В методе data наследуемой модели, если он сейчас был вызван для какой-то роли ROLE кроме Qt::DisplayRole и Qt::EditRole, нельзя запросить у базовой модели данные для ролей кроме ROLE? Так что-ли? Хотя, вряд ли... Видимо, Вы, отвечая на второй вопрос, имели в виду совсем другое.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

Сообщений в этой теме


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


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




RSS Текстовая версия Сейчас: 27.11.2024, 3:50