crossplatform.ru

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


  Ответ в TreeView и модель на базе QAbstractItemModel, как заставить обновляться только определенный node
Введите ваше имя
Подтвердите код

Введите в поле код из 6 символов, отображенных в виде изображения. Если вы не можете прочитать код с изображения, нажмите на изображение для генерации нового кода.
Теги
Выровнять по центру
Ссылка на тему
Ссылка на сообщение
Скрытый текст
Сокращение
Код с подсветкой
Offtopic
 
Удалить форматирование
Спец. элементы
Шрифт
Размер
 
Цвет шрифта
 
Отменить ввод
Вернуть ввод
Полужирный
Курсив
Подчеркнутый
 
 
Смайлики
Вставить изображение
Вставить адрес электронной почты
Цитата
Код
Раскрывающийся текст
 
Увеличить отступ
По левому краю
По центру
По правому краю
Вставить список
Вставить список

Опции сообщения
 Включить смайлы?
Иконки сообщения
(Опционально)
                                
                                
  [ Без иконки ]
 


Последние 10 сообщений [ в обратном порядке ]
Tonal Дата 11.8.2008, 10:40
  Я имею в виду, что можно просто объявить OnValueChanged сигналом а те, кому интересно его получать просто конектятся к нему. При этом тип ListenerSlot и член m_Listeners становятся ненужными.
Delphist Дата 11.8.2008, 8:52
 
Цитата(Tonal @ 10.8.2008, 14:05) *
Кстати, а зачем ты дублируешь Qt-шную систему сигнал/слот с помощью QLinkedList<ListenerSlot>? Сигнал/слот вполне хорошо с этим справляется.

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

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

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

Не все. По умолчанию, только те, которые реализованы в декларации класса.
void* Дата 8.8.2008, 21:21
  и кстати нет смысла писать явно inline, т.к. по умолчанию итак все методы класса являются inline
Litkevich Yuriy Дата 8.8.2008, 15:06
  Дерево и модель взаимодействуют автоматически, и достаточно эфективно, ни чего лишнего не гоняется.
Тебе надо в твоей модели метод получения данных сделать читай тут
Delphist Дата 8.8.2008, 13:38
 
Цитата(Litkevich Yuriy @ 8.8.2008, 13:31) *
что-то я не понял при чем здесь CMyClass, речь вроде о представлении и модели идет?

Да, все правильно, но ведь модель будет строится на данных CMyClass
Litkevich Yuriy Дата 8.8.2008, 13:31
  что-то я не понял при чем здесь CMyClass, речь вроде о представлении и модели идет?
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();
}
Просмотр темы полностью (откроется в новом окне)
RSS Рейтинг@Mail.ru Текстовая версия Сейчас: 5.7.2025, 2:42