crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )

 
Ответить в данную темуНачать новую тему
> TreeView и модель на базе QAbstractItemModel, как заставить обновляться только определенный node
Delphist
  опции профиля:
сообщение 8.8.2008, 12:26
Сообщение #1


Студент
*

Группа: Новичок
Сообщений: 41
Регистрация: 4.8.2008
Из: Россия
Пользователь №: 249

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




Репутация:   0  


У меня есть класс который имеет ряд свойств и содержит внутри себя QHash с объектами того же типа в итоге получается иерархический класс:
CMyClass/
{
public:
    
    CMyClass();

    inline QString getName() const {return m_sName;}
                inline CMyClass *getParent() {return m_pOwner;}
    inline CMyClass& operator[](QString sKey) {return getProperty(sKey);}

                ...
    
private:
    CMyClass& getProperty(QString sKey);
    QHash<QString,CMyClass> m_Properties;
    
    QString           m_sName;
    CMyClass      *m_pOwner;
    
    struct ListenerSlot
    {/*код не особо имеющий в данном случае значение*/};
    QLinkedList<ListenerSlot> m_Listeners;
};


Для отображения я использую TreeView и соответственно собственную модель данных
наследованную от QAbstractItemModel. Вопрос такой дело в том что когда у моего
объекта меняется свойство например m_sName, то для всех m_Listeners генерится OnValueChanged.
И нужно чтобы эти изменения сразу отображались в TreeView, вопрос как заставить обновляться не все дерево,
только отдельный элемент.
Конечно можно было сделать так, но это не очень эффективно:
/*прототип*/
OnValueChanged(const СMyClass &myClass)
{
    Node *rootNode = GetNewNode(myClass);
    MyModel->setRootNode(rootNode);
}

void CMyModel::setRootNode(Node *node)
{
    delete rootNode;
    rootNode = node;
    reset();
}
Причина редактирования: для кода используйте тег code=cpp
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 8.8.2008, 13:31
Сообщение #2


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

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

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




Репутация:   94  


что-то я не понял при чем здесь CMyClass, речь вроде о представлении и модели идет?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Delphist
  опции профиля:
сообщение 8.8.2008, 13:38
Сообщение #3


Студент
*

Группа: Новичок
Сообщений: 41
Регистрация: 4.8.2008
Из: Россия
Пользователь №: 249

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




Репутация:   0  


Цитата(Litkevich Yuriy @ 8.8.2008, 13:31) *
что-то я не понял при чем здесь CMyClass, речь вроде о представлении и модели идет?

Да, все правильно, но ведь модель будет строится на данных CMyClass
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 8.8.2008, 15:06
Сообщение #4


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

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

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




Репутация:   94  


Дерево и модель взаимодействуют автоматически, и достаточно эфективно, ни чего лишнего не гоняется.
Тебе надо в твоей модели метод получения данных сделать читай тут
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
void*
  опции профиля:
сообщение 8.8.2008, 21:21
Сообщение #5


Программист-самоучка
***

Группа: Участник
Сообщений: 429
Регистрация: 4.6.2008
Пользователь №: 193

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




Репутация:   3  


и кстати нет смысла писать явно inline, т.к. по умолчанию итак все методы класса являются inline
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
niXman
  опции профиля:
сообщение 8.8.2008, 22:05
Сообщение #6


Участник
**

Группа: Участник
Сообщений: 169
Регистрация: 18.6.2008
Пользователь №: 204

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




Репутация:   0  


Цитата(void* @ 8.8.2008, 22:21) *
и кстати нет смысла писать явно inline, т.к. по умолчанию итак все методы класса являются inline

Не все. По умолчанию, только те, которые реализованы в декларации класса.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Tonal
  опции профиля:
сообщение 10.8.2008, 14:05
Сообщение #7


Активный участник
***

Группа: Участник
Сообщений: 452
Регистрация: 6.12.2007
Из: Новосибирск
Пользователь №: 34

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




Репутация:   17  


Цитата(Delphist @ 8.8.2008, 16:26) *
...вопрос как заставить обновляться не все дерево, а только отдельный элемент.

Послать OnValueChanged модельке, которая преобразует const СMyClass & в QModelIndex и сгенерирует сигнал dataChanged. Нет?

Кстати, а зачем ты дублируешь Qt-шную систему сигнал/слот с помощью QLinkedList<ListenerSlot>? Сигнал/слот вполне хорошо с этим справляется. :)
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Delphist
  опции профиля:
сообщение 11.8.2008, 8:52
Сообщение #8


Студент
*

Группа: Новичок
Сообщений: 41
Регистрация: 4.8.2008
Из: Россия
Пользователь №: 249

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




Репутация:   0  


Цитата(Tonal @ 10.8.2008, 14:05) *
Кстати, а зачем ты дублируешь Qt-шную систему сигнал/слот с помощью QLinkedList<ListenerSlot>? Сигнал/слот вполне хорошо с этим справляется.

Не понял
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Tonal
  опции профиля:
сообщение 11.8.2008, 10:40
Сообщение #9


Активный участник
***

Группа: Участник
Сообщений: 452
Регистрация: 6.12.2007
Из: Новосибирск
Пользователь №: 34

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




Репутация:   17  


Я имею в виду, что можно просто объявить OnValueChanged сигналом а те, кому интересно его получать просто конектятся к нему. При этом тип ListenerSlot и член m_Listeners становятся ненужными.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

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


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




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