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
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
 
Начать новую тему
Ответов
Litkevich Yuriy
  опции профиля:
сообщение 3.4.2012, 19:51
Сообщение #2


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

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

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




Репутация:   94  


Цитата(Steklova Olga @ 3.4.2012, 21:04) *
Метод data, который я переопределяю, вызывается для каждой из ролей, которые вообще существуют для модели?
существует только один метод data, один из аргументов которого - роль.
этот метод вызывается для роли, которая интересует вызывающего (объекта).
Если этим объектом является представление, то:
1) для отображения данных представление вызывает соответствующий метод делегата, а тот в свою очередь Модель::data (..., Qt::DisplayRole)
2) для отображения данных при редактировании элемента представление вызывает соответствующий метод делегата, а тот в свою очередь Модель::data (..., Qt::EditRole)
3) если указатель мыши зависнет над элементом (делегатом) на некоторое время, то представление вызывает Модель::data (..., Qt::ToolTipRole).

Цитата(Steklova Olga @ 3.4.2012, 21:04) *
2. Порядок вызова метода data для ролей одного и того же элемента модели - непредсказуем?
мой ответ выше должен ответить тебе и на этот вопрос.

Цитата(Steklova Olga @ 3.4.2012, 21:04) *
3. При переопределении метода data
...
но можно ли писать так:
что именно смущает?

Цитата(Steklova Olga @ 3.4.2012, 21:04) *
4. Можно ли при переопределении роли Qt::ForegroundRole проверять равенство (valueForDisplayRole.toInt() == 1) ?
Если valueForDisplayRole действительно всегда будет ЦЕЛОЕ, тогда можно.

Цитата(Steklova Olga @ 3.4.2012, 21:04) *
Совсем глупый вопрос: на это не влияет то, что при переопределении роли case Qt::DisplayRole я заменила отображение 1 на "ВАЖНЫЙ"?
нет, не влияет. Т.к. "1" возвращает метод data базового класса ( value = QSqlRelationalTableModel::data(index, role); ) и
проверку условия ты делаешь с данными, которые возвращает тот же метод ( valueForDisplayRole = QSqlRelationalTableModel::data(index, Qt::DisplayRole) ), а не метод твоего класса - MyModel_msg_list::data (который возвращает уже строку).

П.С.
так:
Цитата(Steklova Olga @ 3.4.2012, 21:04) *
return value.toInt() == 1 ? "ВАЖНЫЙ" : "ОБЫЧНЫЙ"; // Где value - QVariant
лучше не делать, т.к. это строка из char-ов. Лучше сразу привести к QString, например:
return value.toInt() == 1 ? QString("ВАЖНЫЙ") : QString("ОБЫЧНЫЙ");


П.П.С.
Запись на русском явно вызовет проблему в будущем, приводи все русскоязычные литералы к QString с корректным преобразованием кодировки.
Впринципе дурацкий, но быстрый способ: файл с исходником в кодировке UTF-8, тогда код выглядит так:
return value.toInt() == 1 ? tr::Utf8("ВАЖНЫЙ") : tr::Utf8("ОБЫЧНЫЙ");
Лучше использовать QTextCodec

Если кодировка исходника в UTF8 и не нужно, чтобы литералы попадали в перевод, можно использовать другую готовую функцию:
QString::fromUtf8(...)
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

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


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


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




RSS Текстовая версия Сейчас: 23.11.2024, 6:22