QVariant data() роли. |
Здравствуйте, гость ( Вход | Регистрация )
QVariant data() роли. |
Ponchikus |
15.7.2015, 3:47
Сообщение
#1
|
Студент Группа: Участник Сообщений: 21 Регистрация: 25.6.2015 Пользователь №: 4411 Спасибо сказали: 0 раз(а) Репутация: 0 |
Здравствуйте!!!
Начал потихоньку изучать модель/представление. Появилось пару вопросов, прошу разъяснить мне простым языком некоторые моменты. А именно. Первое. Как вообще использовать роли ? Как они вызываются в приложении, для чего они вообще нужны и что с ними можно делать?? Второе. Функция QVariant data(const QModelIndex &index, int role) const; Когда она вызывается? Кто ее вызывает? Сама роль вызывает эту функцию? Третье. В документации, есть описание - Описание Роли элемента Роль указывает модели, данные какого типа будут переданы. Представления могут отображать роли различными способами, поэтому важно обеспечить информацию, соответствующую каждой роли. Не могли бы вы пояснить ее более простыми словами, с примерами, если можно. Помогите понять, что-то вообще не могу сообразить как все устроено... СПАСИБО! |
|
|
lanz |
15.7.2015, 10:08
Сообщение
#2
|
Старейший участник Группа: Участник Сообщений: 690 Регистрация: 28.12.2012 Пользователь №: 3660 Спасибо сказали: 113 раз(а) Репутация: 8 |
1. Стандартные роли используются стандартными видами в Qt
Здесь описано для чего нужна каждая http://doc.qt.io/qt-4.8/qt.html#ItemDataRole-enum Минимально необходимая это Qt::DisplayRole Роли не вызываются, это просто числа. Представьте что скаждым элементом модели у вас ассоциировано некоторое количество данных: - текст который показывается пользователю - картинка - подсказка Когда мы говорим модели дай нам данные для элемента Х, мы указываем для чего именно нам нужны данные Qt::DisplayRole - текст, покажем пользователю, модель должна вернуть текст Qt::DecorationRole - картинку нарисуем, модель должна вернуть картинку Qt::ToolTipRole - подсказку по данному элементу 2. Функцию data может вызвать кто угодно, обычно ее вызывает вид(представление) Эта функция как раз для того чтобы получить данные которые содержит модель. 3. Обязательных ролей нет, но если не обеспечить хотя бы Qt::DisplayRole или Qt::DecorationRole, то ничего не отобразится. Вот хорошее описание http://doc.qt.io/qt-4.8/modelview.html |
|
|
Ponchikus |
15.7.2015, 15:23
Сообщение
#3
|
Студент Группа: Участник Сообщений: 21 Регистрация: 25.6.2015 Пользователь №: 4411 Спасибо сказали: 0 раз(а) Репутация: 0 |
Спасибо за ответ!
1. Т.е. если я правильно понял. К примеру создаем QList<int> list, и записываем туда элементы данных - list<<15<<29<<5; То вот у каждого элемента (15 , 29 , 5 ), например у 29 - есть набор (лично этого элемента данных) ролей(констант), и именно от этого элемента представление вызывает роли? К примеру навели мышкой на элемент данных 29, и представление вызывает функцию data() с ролью подсказки (Qt :: ToolTipRole) т.е. передает в функцию индекс модели и константу 13. Правильно ??? И вот по третьему пункту не совсем понятно вот это -- "Роль указывает модели, данные какого типа будут переданы." Какие данные ?? СПАСИБО! |
|
|
lanz |
15.7.2015, 16:40
Сообщение
#4
|
Старейший участник Группа: Участник Сообщений: 690 Регистрация: 28.12.2012 Пользователь №: 3660 Спасибо сказали: 113 раз(а) Репутация: 8 |
Цитата К примеру навели мышкой на элемент данных 29, и представление вызывает функцию data() с ролью подсказки (Qt :: ToolTipRole) т.е. передает в функцию индекс модели и константу 13. Это верно. Цитата и именно от этого элемента представление вызывает роли? Нужно прояснить, что значит "вызывает роли", пока я не понял Цитата И вот по третьему пункту не совсем понятно вот это -- "Роль указывает модели, данные какого типа будут переданы." Какие данные ?? QVariant, который вернется из функции data. |
|
|
Ponchikus |
15.7.2015, 17:18
Сообщение
#5
|
Студент Группа: Участник Сообщений: 21 Регистрация: 25.6.2015 Пользователь №: 4411 Спасибо сказали: 0 раз(а) Репутация: 0 |
Цитата Нужно прояснить, что значит "вызывает роли", пока я не понял Проясняю . "Вызывает роли". Имеется ввиду, что, у элемента данных, т.е. 29, имеется набор ролей, в смысле у каждого элемента данных, есть его собственный набор ролей(Qt::DisplayRole, Qt::ToolTipRole, и т.д.) У 29, свой Qt::DisplayRole, у 15 свой Qt::DisplayRole. И вот когда я навожу мышку на элемент 29, то он передает в функцию data() именно свою роль Qt::ToolTipRole. А 15 будет передавать свою роль Qt::DisplayRole. Я правильно понимаю? Это так ?? Цитата QVariant, который вернется из функции data. Все равно не могу понять... Получается если в модели лежат данные типа int (29, 15, 5), то QVariant вернет int ? |
|
|
lanz |
15.7.2015, 17:43
Сообщение
#6
|
Старейший участник Группа: Участник Сообщений: 690 Регистрация: 28.12.2012 Пользователь №: 3660 Спасибо сказали: 113 раз(а) Репутация: 8 |
Цитата Я правильно понимаю? Это так ?? Есть две точки зрения 1. С точки зрения представления - внешний интерфейс модели: У нас есть модель, неважно где мы ее взяли:
в которой три строки
в которой есть один столбец
получим индекс первой строки первого столбца
получим данные для этого элемента
теперь напишем в нужной ячейке текст, который мы получили ("29") если пользователь навел мышку в ячейку, покажем подсказку ("Это число!") не будем рисовать иконку, модель ничего не вернула 2. Та же самая модель, вид изнутри
Сообщение отредактировал lanz - 15.7.2015, 17:44 |
|
|
Ponchikus |
15.7.2015, 18:03
Сообщение
#7
|
Студент Группа: Участник Сообщений: 21 Регистрация: 25.6.2015 Пользователь №: 4411 Спасибо сказали: 0 раз(а) Репутация: 0 |
Кажется понимаю. QVariant вернет тип данных, в зависимости от роли, которую передаем в метод data().
Таким образом, если мы сделаем вот так:
QVariant преобразуется в QSize, и изменит размер ячейки (10,10)?? А как тогда модель определяет, какая именно роль в данный момент ей передается?? Это похоже на обработчика событий (QPaintEvent, QResizeEvent...)?? |
|
|
lanz |
15.7.2015, 18:16
Сообщение
#8
|
Старейший участник Группа: Участник Сообщений: 690 Регистрация: 28.12.2012 Пользователь №: 3660 Спасибо сказали: 113 раз(а) Репутация: 8 |
Цитата QVariant преобразуется в QSize, и изменит размер ячейки (10,10)?? Ну это зависит от реализации конкретного представления, может поменять, а может проигнорировать Цитата А как тогда модель определяет, какая именно роль в данный момент ей передается?? Это похоже на обработчика событий (QPaintEvent, QResizeEvent...)?? Да вот же она, передается как параметр: QVariant MyModel::data( const QModelIndex & idx, Qt::ItemDataRole role ) Сообщение отредактировал lanz - 15.7.2015, 18:16 |
|
|
Ponchikus |
15.7.2015, 18:30
Сообщение
#9
|
Студент Группа: Участник Сообщений: 21 Регистрация: 25.6.2015 Пользователь №: 4411 Спасибо сказали: 0 раз(а) Репутация: 0 |
Цитата А как тогда модель определяет, какая именно роль в данный момент ей передается?? Это похоже на обработчика событий (QPaintEvent, QResizeEvent...)?? Цитата Да вот же она, передается как параметр: QVariant MyModel::data( const QModelIndex & idx, Qt::ItemDataRole role ) Это понятно, а как представление определяет с какой именно ролью вызывать эту функцию?? Т.е. как представление определяет что сейчас передается роль Qt::ToolTipRole, откуда оно узнаёт что мы передаётся роль 13(Qt::ToolTipRole) ? |
|
|
lanz |
15.7.2015, 18:50
Сообщение
#10
|
Старейший участник Группа: Участник Сообщений: 690 Регистрация: 28.12.2012 Пользователь №: 3660 Спасибо сказали: 113 раз(а) Репутация: 8 |
Цитата Это понятно, а как представление определяет с какой именно ролью вызывать эту функцию?? Т.е. как представление определяет что сейчас передается роль Qt::ToolTipRole, откуда оно узнаёт что мы передаётся роль 13(Qt::ToolTipRole) ? Нужно ей тултип показать - она передает ToolTipRole, Нужно ячейку перерисовать, передает DisplayRole, В общем по мере надобности А уж представление знает когда что ему нужно. А то какая роль за что отвечает - это соглашение. Сообщение отредактировал lanz - 15.7.2015, 18:51 |
|
|
Текстовая версия | Сейчас: 28.11.2024, 1:58 |