На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
! Правила раздела *nix / gcc / Eclipse / Qt / wxWidgets / GTK+
  • При создании темы ОБЯЗАТЕЛЬНО указывайте версию тулкита / библиотеки / компилятора.
  • Перед тем как задать вопрос, сформулируйте его правильно, чтобы вас могли понять.
  • Нарушение Правил может повлечь наказание со стороны модераторов.


Полезные ссылки:
user posted image Boost по-русски
user posted image Qt по-русски
Модераторы: archimed7592
  
> QTreeWidget
    я хочу в данном компаненте отображать иерархические данные.
    Обновление данных происходит каждую секунду. Сами данные представляют 2 уровня - вершины и элементы вершин.

    Вся проблемма в том, что данные постоянно изменяются (удаляются, добавляются). Причем как вершины так и элементы.

    Я перед отображением новых данных подчищаю старые и отрисовываю заново.
    Удаление и добавление впринципе проходит нормально. Но вот если я раскрыл какой-то узел и данные
    отрисовались заново, то этот узел закрывается.

    Ослеживать открытые вершины и открывать их для новых данных не очень бы хотелось.
    Можно ли как еще решить решить данную проблемму. Например используя модели,...
      zss, тебя спасет только TTreeView + своя собственная модель данных. Это, на самом деле, не так сложно.
      На стандартных же виджетах ты это не реализуешь - все будет моргать.
        Flex Ferrum, а что даст модель ?
          Цитата zss @
          Flex Ferrum, а что даст модель ?

          Более гибкий контроль над данными. Я буквально с полмесяца назад решал подобную задачу. И также с достаточно частым обновлением.
          Тут фишка в том, что модель может хранить данные в своем представлении и удобным для нее способом реагировать на изменение исходных данных. Ну и информировать виды о том, что (и каким образом) данные изменились.

          Добавлено
          Т. е. грубо говоря, модель на очередной итерации сверяет отображенные в настоящий момент данные с новым состоянием исходных. Определяет - какие элементы изменились, какие добавились, какие были удалены. И в соответствии с этим меняет состояние отображаемых данных и информирует об этом виды. Достаточно удобно и без лишнего гемора.
            Цитата Flex Ferrum @
            Т. е. грубо говоря, модель на очередной итерации сверяет отображенные в настоящий момент данные с новым состоянием исходных. Определяет - какие элементы изменились, какие добавились, какие были удалены. И в соответствии с этим меняет состояние отображаемых данных и информирует об этом виды. Достаточно удобно и без лишнего гемора

            ну тоесть уже существуют стандартные модели или нужно создавать свою для своих данных ?
              Цитата zss @
              ну тоесть уже существуют стандартные модели или нужно создавать свою для своих данных ?

              В данном случае лучше создать свою. Но! Естественно, ты будешь наследовать ее от QAbstractItemModel. Дело в том, что сложного там ничего нет. Главное - грамотно перегрузить функции. А документация подробно расскажет - как это лучше делать.
                Flex Ferrum, а можно ли связывать модели. Тоесть я хочу не создавать иерархию на основе дерева,
                а разбить уровни на два списка. Тоесть в одном 1 уровень, во 2 - второй.

                Я хочу при выборе первого уровня, чтоб отображались для него данные во 2. Но сами данные как бы едины для обоих списков.
                  Цитата zss @
                  Flex Ferrum, а можно ли связывать модели. Тоесть я хочу не создавать иерархию на основе дерева,
                  а разбить уровни на два списка. Тоесть в одном 1 уровень, во 2 - второй.

                  Да связать то, я думаю, можно. Но вот что будет в режиме быстрого обновления...
                    Цитата Flex Ferrum @
                    Да связать то, я думаю, можно. Но вот что будет в режиме быстрого обновления...

                    еу например просто посылать сигналы от одного списка к другому при поступлении новых данных
                      Я попытался создать модель, но что-то запутался

                      Я хочу в одном из столбце вместо цифр использовать ProgressBar.

                      Для этого мене нужно использовать связку QListView/QAbstarctItemModel или QListWidget/QAbstarctListModel
                        Цитата zss @
                        Для этого мене нужно использовать связку QListView/QAbstarctItemModel или QListWidget/QAbstarctListModel

                        Нет. Для этого тебе нужно использовать QItemDelegate.

                        Добавлено
                        Билн, были бы исходники моими - пример бы показал. А так... Незя... :(
                          Цитата Flex Ferrum @
                          Нет. Для этого тебе нужно использовать QItemDelegate.

                          На сколько я понял для загрузки данных нужно использовать QTreeView/QAbstractListModel

                          А вод для более тонкого управления (например для вставки в ячейку Qlabel) нужно использовать QItemDelegate
                          Сообщение отредактировано: zss -
                            Flex Ferrum, создал я модель на основе QAbstractListModel.
                            Перекрыл 4 метода. Но что-то не пойму:

                            1. Как в методе headerData задать размер колонок
                            2. При выборе строки происходит ее выделение. Но после обновления данных выделение снимается. Как можно это победить ?
                            3. В методе data() возвращается QVariant. А как можно вставить картинку ?


                            Цитата Flex Ferrum @
                            Нет. Для этого тебе нужно использовать QItemDelegate.

                            На сколько я понял делегат для редактирования нужен. Как на его основе засунуть стандартный компанент и изменять его значение.
                              Блин.... как же настроить эти списки друг на друга :angry: >:(
                                Цитата zss @
                                2. При выборе строки происходит ее выделение. Но после обновления данных выделение снимается. Как можно это победить ?

                                Цитата zss @

                                Ослеживать открытые вершины и открывать их для новых данных не очень бы хотелось.
                                А почему? Я успешно реализовывал это решение. Накладных расходов требует не очень много, по одному сравнению идентификаторов на каждый отрисовываемый элемент. И своих моделей создавать не надо.
                                  Цитата zss @
                                  1. Как в методе headerData задать размер колонок

                                  Никак.
                                  Цитата zss @
                                  2. При выборе строки происходит ее выделение. Но после обновления данных выделение снимается. Как можно это победить ?

                                  Нужно не удалять/добавлять данные в любом случае, а именно обновлять их. См. метод dataChanged. Тогда выделение не снимается.
                                  Цитата zss @
                                  3. В методе data() возвращается QVariant. А как можно вставить картинку ?

                                  Возвращать QVariant, сконструированный из QIcon/QPixmap.
                                    Цитата Атос @
                                    А почему? Я успешно реализовывал это решение. Накладных расходов требует не очень много, по одному сравнению идентификаторов на каждый отрисовываемый элемент. И своих моделей создавать не надо.

                                    Ты про QTreeWidget ? Я хотел его использовать, но есть 2 проблеммы
                                    - не знаю как у него вставлять иконки, а в модели вроде понял как
                                    - мерцание при перерисовке

                                    Добавлено
                                    Цитата Flex Ferrum @
                                    Нужно не удалять/добавлять данные в любом случае, а именно обновлять их. См. метод dataChanged. Тогда выделение не снимается.

                                    а как же быть, если появятся новые строки ? Я просто не совсем понимаю как dataChanged поймет, что количество строк изменилось
                                      Цитата zss @
                                      а как же быть, если появятся новые строки ? Я просто не совсем понимаю как dataChanged поймет, что количество строк изменилось

                                      Так я же говорю. Ты в модели должен хранить текущий набор отображаемых записей. При обновлении данных (ну, положим, раз в полсекунды) ты сверяешь отображаемый набор записей с фактическим на текущий момент. После чего удаляешь те, которые уже отсутствуют, добавляешь те, которые появились новые, и обновляешь уже имеющиеся. Сопровождаешь эти операции вызовом соответствующих функций.
                                        Цитата Flex Ferrum @
                                        Нужно не удалять/добавлять данные в любом случае, а именно обновлять их. См. метод dataChanged. Тогда выделение не снимается.


                                        Так dataChanged это сигнал, а не виртуальный метод. Что-то не совсем понял...
                                        Сообщение отредактировано: zss -
                                          Flex Ferrum, ты где ? :)
                                            Цитата zss @
                                            Так dataChanged это сигнал, а не виртуальный метод. Что-то не совсем понял...

                                            Ну все правильно. Сигнал. Ловится видом и соответствующим образом обрабатывается. Только инициируешь его ты в момент обновления данных в модели.
                                              Ну вроде слава богу разобрался :) Вроде все строится...

                                              Осталось еще
                                              1. Как вставить widget в ячейку. Что-то попробовал создать делегат, но ничего не отображается
                                              2. Когда в Qt::DecorationRole возвращаю QIcon/QPixmap, то он отрисовывается в углу. Как его отрисовать по центру ?
                                                Цитата zss @
                                                2. Когда в Qt::DecorationRole возвращаю QIcon/QPixmap, то он отрисовывается в углу. Как его отрисовать по центру

                                                Возвращать это на Qt::TextRole. Думаю, переварит.

                                                Цитата zss @
                                                1. Как вставить widget в ячейку. Что-то попробовал создать делегат, но ничего не отображается

                                                А ты как делегат навешиваешь?
                                                  Цитата Flex Ferrum @
                                                  А ты как делегат навешиваешь?

                                                  вроде заработал :yes:

                                                  Я взял делегат из примера network/torrent. Там делегат отрисовывает QStyleOptionProgressBar.
                                                  Только если полоса накладывается на текст, то текст становится белым и его совсем не видно.
                                                  Как сделать, чтоб текст всегда был темным. Да и хотелось бы звет полосы поменять.


                                                  Цитата Flex Ferrum @
                                                  Возвращать это на Qt::TextRole. Думаю, переварит.

                                                  попробую...
                                                    Цитата Flex Ferrum @
                                                    Возвращать это на Qt::TextRole. Думаю, переварит.

                                                    есть только Qt::TextAligmentRole, но она не помогла :(
                                                      Гм. Да...
                                                        Цитата Flex Ferrum @
                                                        Так я же говорю. Ты в модели должен хранить текущий набор отображаемых записей. При обновлении данных (ну, положим, раз в полсекунды) ты сверяешь отображаемый набор записей с фактическим на текущий момент. После чего удаляешь те, которые уже отсутствуют, добавляешь те, которые появились новые, и обновляешь уже имеющиеся. Сопровождаешь эти операции вызовом соответствующих функций.

                                                        не совсем понятно что обновлять - все даные или измененные. Если измененные, то нет проблом с обновлением существующих. А как быть с добавленными или удаленными ? Что обновлять - все что после них или только их ?
                                                        0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
                                                        0 пользователей:


                                                        Рейтинг@Mail.ru
                                                        [ Script execution time: 0,0706 ]   [ 16 queries used ]   [ Generated: 14.09.24, 21:52 GMT ]