как запросить у модели инф об элементе при переопределении метода data модели |
Здравствуйте, гость ( Вход | Регистрация )
как запросить у модели инф об элементе при переопределении метода data модели |
Steklova Olga |
3.4.2012, 19:04
Сообщение
#1
|
Участник Группа: Участник Сообщений: 198 Регистрация: 27.9.2011 Из: Санкт-Петербург Пользователь №: 2912 Спасибо сказали: 5 раз(а) Репутация: 4 |
Привет!
В моей модели переопределены две роли элементов. При переопределении одной роли элемента модели мне надо использовать информацию о другой роли этого элемента. А именно, для одной из колонок модели цвет текста элемента модели должен быть красным, если значение соотв. поля в соотв. записи таблицы БД равно 1. К тому же, отображение значения этого поля тоже должно быть переопределено (если значение соотв. поля в соотв. записи таблицы БД равно 1, то вместо 1 надо отобразить ВАЖНЫЙ, иначе надо отобразить ОБЫЧНЫЙ). В справке сказано , что мы можем запросить у модели информацию об элементе, передав ей модельный индекс, соответствующий элементу, и задав роль для получения данных желаемого типа: QVariant value = model->data(index, role); Но мне нужно сделать это при переопределении метода data модели. Вот мой код:
А вот что я не понимаю: 1. Метод data, который я переопределяю, вызывается для каждой из ролей, которые вообще существуют для модели? 2. Порядок вызова метода data для ролей одного и того же элемента модели - непредсказуем? 3. При переопределении метода data можно писать: но можно ли писать так: или так (что то же самое): 4. Можно ли при переопределении роли Qt::ForegroundRole проверять равенство (valueForDisplayRole.toInt() == 1) ?Совсем глупый вопрос: на это не влияет то, что при переопределении роли case Qt::DisplayRole я заменила отображение 1 на "ВАЖНЫЙ"? Спасибо за внимание |
|
|
Litkevich Yuriy |
3.4.2012, 19:51
Сообщение
#2
|
разработчик РЭА Группа: Сомодератор Сообщений: 9669 Регистрация: 9.1.2008 Из: Тюмень Пользователь №: 64 Спасибо сказали: 807 раз(а) Репутация: 94 |
Метод data, который я переопределяю, вызывается для каждой из ролей, которые вообще существуют для модели? существует только один метод data, один из аргументов которого - роль.этот метод вызывается для роли, которая интересует вызывающего (объекта). Если этим объектом является представление, то: 1) для отображения данных представление вызывает соответствующий метод делегата, а тот в свою очередь Модель::data (..., Qt::DisplayRole) 2) для отображения данных при редактировании элемента представление вызывает соответствующий метод делегата, а тот в свою очередь Модель::data (..., Qt::EditRole) 3) если указатель мыши зависнет над элементом (делегатом) на некоторое время, то представление вызывает Модель::data (..., Qt::ToolTipRole). 2. Порядок вызова метода data для ролей одного и того же элемента модели - непредсказуем? мой ответ выше должен ответить тебе и на этот вопрос.3. При переопределении метода data что именно смущает?... но можно ли писать так: 4. Можно ли при переопределении роли Qt::ForegroundRole проверять равенство (valueForDisplayRole.toInt() == 1) ? Если valueForDisplayRole действительно всегда будет ЦЕЛОЕ, тогда можно.Совсем глупый вопрос: на это не влияет то, что при переопределении роли case Qt::DisplayRole я заменила отображение 1 на "ВАЖНЫЙ"? нет, не влияет. Т.к. "1" возвращает метод data базового класса ( value = QSqlRelationalTableModel::data(index, role); ) ипроверку условия ты делаешь с данными, которые возвращает тот же метод ( valueForDisplayRole = QSqlRelationalTableModel::data(index, Qt::DisplayRole) ), а не метод твоего класса - MyModel_msg_list::data (который возвращает уже строку). П.С. так: return value.toInt() == 1 ? "ВАЖНЫЙ" : "ОБЫЧНЫЙ"; // Где value - QVariant лучше не делать, т.к. это строка из char-ов. Лучше сразу привести к QString, например:
П.П.С. Запись на русском явно вызовет проблему в будущем, приводи все русскоязычные литералы к QString с корректным преобразованием кодировки. Впринципе дурацкий, но быстрый способ: файл с исходником в кодировке UTF-8, тогда код выглядит так: Лучше использовать QTextCodecЕсли кодировка исходника в UTF8 и не нужно, чтобы литералы попадали в перевод, можно использовать другую готовую функцию: QString::fromUtf8(...) |
|
|
Steklova Olga |
3.4.2012, 21:33
Сообщение
#3
|
Участник Группа: Участник Сообщений: 198 Регистрация: 27.9.2011 Из: Санкт-Петербург Пользователь №: 2912 Спасибо сказали: 5 раз(а) Репутация: 4 |
Большое спасибо, Litkevich Yuriy
Ответы на вопросы 1 и 2 поняла. По вопросам 3 и 4 меня смущало следующее. Правильно ли я понимаю, что в методе data наследуемой модели, независимо от того, для какой роли он сейчас был вызван, можно запросить у базовой модели данные не только для этой роли, а вообще для любой роли? Можно рассчитывать на то, что в базовой модели всегда определены данные для любой роли? Насчет операторов: первый из них списала из примера создания наследуемой модели,второй, скажу честно, списала из него, даже не поняв, что обращаюсь к базовой модели, а не к наследуемой. Пока Вы не разжевали, у меня была просто каша в понимании того, что я написала. Надо будет мне разобраться с наследованием... Насчет кодировок. Я пишу проект не одна. Строки на экране должны отображаться только по-русски, перевода пока не предполагается. Кодировка исходников - Windows-1251. Кодировка моей БД Firebird 2.1 - WIN1251. Сейчас запускаем наш проект в Windows. Потом, возможно, будем запускать его в Linux. Мы используем QTextCodec так:
Лучше делать кодировку исходников и БД одинаковыми, чтобы не было доп. проблем? Цитата так: return value.toInt() == 1 ? "ВАЖНЫЙ" : "ОБЫЧНЫЙ"; // Где value - QVariant лучше не делать, т.к. это строка из char-ов. Лучше сразу привести к QString, например: return value.toInt() == 1 ? QString("ВАЖНЫЙ") : QString("ОБЫЧНЫЙ"); А если оставить так как у меня, чем это плохо? Или, в соответствии с кодировкой моего проекта, лучше делать так:
|
|
|
Litkevich Yuriy |
4.4.2012, 11:22
Сообщение
#4
|
разработчик РЭА Группа: Сомодератор Сообщений: 9669 Регистрация: 9.1.2008 Из: Тюмень Пользователь №: 64 Спасибо сказали: 807 раз(а) Репутация: 94 |
Правильно ли я понимаю, что в методе data наследуемой модели, независимо от того, для какой роли он сейчас был вызван, можно запросить у базовой модели данные не только для этой роли, а вообще для любой роли? ну да. Ты же можешь передать в метод базового класса любое значение аргумента.Можно рассчитывать на то, что в базовой модели всегда определены данные для любой роли? нет, к сожалению троли поленились. Если заглянешь в исходники то увидишь, что кроме Qt::DisplayRole и Qt::EditRole ничего не обрабатывается.Или, в соответствии с кодировкой моего проекта, лучше делать так: вместо fromAscii нужно fromLocal8bit.а так как ты устнавливаешь кодек для Си-строк равный локали, то можно просто QString("ВАЖНЫЙ"), т.к. Си-строки преобразуются именно с помощью кодека для Си-строк. |
|
|
Steklova Olga |
5.4.2012, 19:14
Сообщение
#5
|
Участник Группа: Участник Сообщений: 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? Так что-ли? Хотя, вряд ли... Видимо, Вы, отвечая на второй вопрос, имели в виду совсем другое. |
|
|
Текстовая версия | Сейчас: 30.11.2024, 2:28 |