Версия для печати темы

Нажмите сюда для просмотра этой темы в обычном формате

Форум на CrossPlatform.RU _ Qt Модель/Представление _ TreeView и модель на базе QAbstractItemModel, как заставить обновляться только определенный node

Автор: Delphist 8.8.2008, 12:26

У меня есть класс который имеет ряд свойств и содержит внутри себя 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();
}

Автор: Litkevich Yuriy 8.8.2008, 13:31

что-то я не понял при чем здесь CMyClass, речь вроде о представлении и модели идет?

Автор: Delphist 8.8.2008, 13:38

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

Да, все правильно, но ведь модель будет строится на данных CMyClass

Автор: Litkevich Yuriy 8.8.2008, 15:06

Дерево и модель взаимодействуют автоматически, и достаточно эфективно, ни чего лишнего не гоняется.
Тебе надо в твоей модели метод получения данных сделать читай http://crossplatform.ru/documentation/qtdoc4.3/model-view-creating-models.php

Автор: void* 8.8.2008, 21:21

и кстати нет смысла писать явно inline, т.к. по умолчанию итак все методы класса являются inline

Автор: niXman 8.8.2008, 22:05

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

Не все. По умолчанию, только те, которые реализованы в декларации класса.

Автор: Tonal 10.8.2008, 14:05

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

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

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

Автор: Delphist 11.8.2008, 8:52

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

Не понял

Автор: Tonal 11.8.2008, 10:40

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

Форум Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)