Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[3.144.6.236] |
|
Сообщ.
#1
,
|
|
|
я хочу в данном компаненте отображать иерархические данные.
Обновление данных происходит каждую секунду. Сами данные представляют 2 уровня - вершины и элементы вершин. Вся проблемма в том, что данные постоянно изменяются (удаляются, добавляются). Причем как вершины так и элементы. Я перед отображением новых данных подчищаю старые и отрисовываю заново. Удаление и добавление впринципе проходит нормально. Но вот если я раскрыл какой-то узел и данные отрисовались заново, то этот узел закрывается. Ослеживать открытые вершины и открывать их для новых данных не очень бы хотелось. Можно ли как еще решить решить данную проблемму. Например используя модели,... |
Сообщ.
#2
,
|
|
|
zss, тебя спасет только TTreeView + своя собственная модель данных. Это, на самом деле, не так сложно.
На стандартных же виджетах ты это не реализуешь - все будет моргать. |
Сообщ.
#3
,
|
|
|
Flex Ferrum, а что даст модель ?
|
Сообщ.
#4
,
|
|
|
Цитата zss @ Flex Ferrum, а что даст модель ? Более гибкий контроль над данными. Я буквально с полмесяца назад решал подобную задачу. И также с достаточно частым обновлением. Тут фишка в том, что модель может хранить данные в своем представлении и удобным для нее способом реагировать на изменение исходных данных. Ну и информировать виды о том, что (и каким образом) данные изменились. Добавлено Т. е. грубо говоря, модель на очередной итерации сверяет отображенные в настоящий момент данные с новым состоянием исходных. Определяет - какие элементы изменились, какие добавились, какие были удалены. И в соответствии с этим меняет состояние отображаемых данных и информирует об этом виды. Достаточно удобно и без лишнего гемора. |
Сообщ.
#5
,
|
|
|
Цитата Flex Ferrum @ Т. е. грубо говоря, модель на очередной итерации сверяет отображенные в настоящий момент данные с новым состоянием исходных. Определяет - какие элементы изменились, какие добавились, какие были удалены. И в соответствии с этим меняет состояние отображаемых данных и информирует об этом виды. Достаточно удобно и без лишнего гемора ну тоесть уже существуют стандартные модели или нужно создавать свою для своих данных ? |
Сообщ.
#6
,
|
|
|
Цитата zss @ ну тоесть уже существуют стандартные модели или нужно создавать свою для своих данных ? В данном случае лучше создать свою. Но! Естественно, ты будешь наследовать ее от QAbstractItemModel. Дело в том, что сложного там ничего нет. Главное - грамотно перегрузить функции. А документация подробно расскажет - как это лучше делать. |
Сообщ.
#7
,
|
|
|
Flex Ferrum, а можно ли связывать модели. Тоесть я хочу не создавать иерархию на основе дерева,
а разбить уровни на два списка. Тоесть в одном 1 уровень, во 2 - второй. Я хочу при выборе первого уровня, чтоб отображались для него данные во 2. Но сами данные как бы едины для обоих списков. |
Сообщ.
#8
,
|
|
|
Цитата zss @ Flex Ferrum, а можно ли связывать модели. Тоесть я хочу не создавать иерархию на основе дерева, а разбить уровни на два списка. Тоесть в одном 1 уровень, во 2 - второй. Да связать то, я думаю, можно. Но вот что будет в режиме быстрого обновления... |
Сообщ.
#9
,
|
|
|
Цитата Flex Ferrum @ Да связать то, я думаю, можно. Но вот что будет в режиме быстрого обновления... еу например просто посылать сигналы от одного списка к другому при поступлении новых данных |
Сообщ.
#10
,
|
|
|
Я попытался создать модель, но что-то запутался
Я хочу в одном из столбце вместо цифр использовать ProgressBar. Для этого мене нужно использовать связку QListView/QAbstarctItemModel или QListWidget/QAbstarctListModel |
Сообщ.
#11
,
|
|
|
Цитата zss @ Для этого мене нужно использовать связку QListView/QAbstarctItemModel или QListWidget/QAbstarctListModel Нет. Для этого тебе нужно использовать QItemDelegate. Добавлено Билн, были бы исходники моими - пример бы показал. А так... Незя... |
Сообщ.
#12
,
|
|
|
Цитата Flex Ferrum @ Нет. Для этого тебе нужно использовать QItemDelegate. На сколько я понял для загрузки данных нужно использовать QTreeView/QAbstractListModel А вод для более тонкого управления (например для вставки в ячейку Qlabel) нужно использовать QItemDelegate |
Сообщ.
#13
,
|
|
|
Flex Ferrum, создал я модель на основе QAbstractListModel.
Перекрыл 4 метода. Но что-то не пойму: 1. Как в методе headerData задать размер колонок 2. При выборе строки происходит ее выделение. Но после обновления данных выделение снимается. Как можно это победить ? 3. В методе data() возвращается QVariant. А как можно вставить картинку ? Цитата Flex Ferrum @ Нет. Для этого тебе нужно использовать QItemDelegate. На сколько я понял делегат для редактирования нужен. Как на его основе засунуть стандартный компанент и изменять его значение. |
Сообщ.
#14
,
|
|
|
Блин.... как же настроить эти списки друг на друга
|
Сообщ.
#15
,
|
|
|
Цитата zss @ 2. При выборе строки происходит ее выделение. Но после обновления данных выделение снимается. Как можно это победить ? Цитата zss @ А почему? Я успешно реализовывал это решение. Накладных расходов требует не очень много, по одному сравнению идентификаторов на каждый отрисовываемый элемент. И своих моделей создавать не надо. Ослеживать открытые вершины и открывать их для новых данных не очень бы хотелось. |
Сообщ.
#16
,
|
|
|
Цитата zss @ 1. Как в методе headerData задать размер колонок Никак. Цитата zss @ 2. При выборе строки происходит ее выделение. Но после обновления данных выделение снимается. Как можно это победить ? Нужно не удалять/добавлять данные в любом случае, а именно обновлять их. См. метод dataChanged. Тогда выделение не снимается. Цитата zss @ 3. В методе data() возвращается QVariant. А как можно вставить картинку ? Возвращать QVariant, сконструированный из QIcon/QPixmap. |
Сообщ.
#17
,
|
|
|
Цитата Атос @ А почему? Я успешно реализовывал это решение. Накладных расходов требует не очень много, по одному сравнению идентификаторов на каждый отрисовываемый элемент. И своих моделей создавать не надо. Ты про QTreeWidget ? Я хотел его использовать, но есть 2 проблеммы - не знаю как у него вставлять иконки, а в модели вроде понял как - мерцание при перерисовке Добавлено Цитата Flex Ferrum @ Нужно не удалять/добавлять данные в любом случае, а именно обновлять их. См. метод dataChanged. Тогда выделение не снимается. а как же быть, если появятся новые строки ? Я просто не совсем понимаю как dataChanged поймет, что количество строк изменилось |
Сообщ.
#18
,
|
|
|
Цитата zss @ а как же быть, если появятся новые строки ? Я просто не совсем понимаю как dataChanged поймет, что количество строк изменилось Так я же говорю. Ты в модели должен хранить текущий набор отображаемых записей. При обновлении данных (ну, положим, раз в полсекунды) ты сверяешь отображаемый набор записей с фактическим на текущий момент. После чего удаляешь те, которые уже отсутствуют, добавляешь те, которые появились новые, и обновляешь уже имеющиеся. Сопровождаешь эти операции вызовом соответствующих функций. |
Сообщ.
#19
,
|
|
|
Цитата Flex Ferrum @ Нужно не удалять/добавлять данные в любом случае, а именно обновлять их. См. метод dataChanged. Тогда выделение не снимается. Так dataChanged это сигнал, а не виртуальный метод. Что-то не совсем понял... |
Сообщ.
#20
,
|
|
|
Flex Ferrum, ты где ?
|
Сообщ.
#21
,
|
|
|
Цитата zss @ Так dataChanged это сигнал, а не виртуальный метод. Что-то не совсем понял... Ну все правильно. Сигнал. Ловится видом и соответствующим образом обрабатывается. Только инициируешь его ты в момент обновления данных в модели. |
Сообщ.
#22
,
|
|
|
Ну вроде слава богу разобрался Вроде все строится...
Осталось еще 1. Как вставить widget в ячейку. Что-то попробовал создать делегат, но ничего не отображается 2. Когда в Qt::DecorationRole возвращаю QIcon/QPixmap, то он отрисовывается в углу. Как его отрисовать по центру ? |
Сообщ.
#23
,
|
|
|
Цитата zss @ 2. Когда в Qt::DecorationRole возвращаю QIcon/QPixmap, то он отрисовывается в углу. Как его отрисовать по центру Возвращать это на Qt::TextRole. Думаю, переварит. Цитата zss @ 1. Как вставить widget в ячейку. Что-то попробовал создать делегат, но ничего не отображается А ты как делегат навешиваешь? |
Сообщ.
#24
,
|
|
|
Цитата Flex Ferrum @ А ты как делегат навешиваешь? вроде заработал Я взял делегат из примера network/torrent. Там делегат отрисовывает QStyleOptionProgressBar. Только если полоса накладывается на текст, то текст становится белым и его совсем не видно. Как сделать, чтоб текст всегда был темным. Да и хотелось бы звет полосы поменять. Цитата Flex Ferrum @ Возвращать это на Qt::TextRole. Думаю, переварит. попробую... |
Сообщ.
#25
,
|
|
|
Цитата Flex Ferrum @ Возвращать это на Qt::TextRole. Думаю, переварит. есть только Qt::TextAligmentRole, но она не помогла |
Сообщ.
#26
,
|
|
|
Гм. Да...
|
Сообщ.
#27
,
|
|
|
Цитата Flex Ferrum @ Так я же говорю. Ты в модели должен хранить текущий набор отображаемых записей. При обновлении данных (ну, положим, раз в полсекунды) ты сверяешь отображаемый набор записей с фактическим на текущий момент. После чего удаляешь те, которые уже отсутствуют, добавляешь те, которые появились новые, и обновляешь уже имеющиеся. Сопровождаешь эти операции вызовом соответствующих функций. не совсем понятно что обновлять - все даные или измененные. Если измененные, то нет проблом с обновлением существующих. А как быть с добавленными или удаленными ? Что обновлять - все что после них или только их ? |