crossplatform.ru

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

2 страниц V   1 2 >  
Ответить в данную темуНачать новую тему
> Тормозит иерархическая модель построенная на QAbstractItemModel (библиотека QT)
Delphist
  опции профиля:
сообщение 20.8.2008, 9:36
Сообщение #1


Студент
*

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

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




Репутация:   0  


Есть иерархическая модель наследуемая от QAbstractItemModel (это библиотека QT), построение модели происходит на основе моего иерархического класса типа:
CMyClass
{
public:
    
    CMyClass();

    inline QString getName() const {return m_sName;}
                inline CMyClass *getParent() {return m_pOwner;}
    inline CMyClass& operator[](QString sKey) {return getProperty(sKey);}
                ...
    void setInt(int v);
    void setName(QString v);

                ...
    
private:
    CMyClass& getProperty(QString sKey);
    QHash<QString,CMyClass*> m_Properties;
    
    QString           m_sName;
    int                   m_nCode;
    CMyClass      *m_pOwner;
};


Этот класс передается по указателю в модель, соответственно когда происходят изменения в CMyClass генерятся сигналы. На все эти сигналы ставяться один и тот же слот модели, который всего лишь делает reset.
В моем классе в каком-то из узлов делаются переодические обновления (меняется nCode и sName) приблизительно 60 обновлений в сек, в итоге капитально тормозит я так понимаю TreeView из-за отрисовки, потому как reset заставляет полностью перестраиваться дерево а надо лишь всего, те узлы которые изменились.

Подскажите пожалуйста, из-за чего происходит торможение и как от него збавиться?

Сообщение отредактировал Delphist - 20.8.2008, 9:44
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
trdm
  опции профиля:
сообщение 20.8.2008, 10:07
Сообщение #2


Дмитрий Трошин
****

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

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




Репутация:   6  


Как насчет профайлинга?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 20.8.2008, 10:54
Сообщение #3


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

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

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




Репутация:   94  


Цитата(Delphist @ 20.8.2008, 13:36) *
приблизительно 60 обновлений в сек

а как человек должен на это смотреть, даже еслиб не тормозило?
Я как пользователь тебяб ногами запинал
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Tonal
  опции профиля:
сообщение 20.8.2008, 13:19
Сообщение #4


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

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

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




Репутация:   17  


Ну так не используй reset.
Модель, при изменении данных, должна генерить сигнал dataChanged.
Тогда вьюшка перерисует только изменившийся элементик. :)
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Delphist
  опции профиля:
сообщение 20.8.2008, 13:34
Сообщение #5


Студент
*

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

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




Репутация:   0  


Цитата(Tonal @ 20.8.2008, 13:19) *
Ну так не используй reset.
Модель, при изменении данных, должна генерить сигнал dataChanged

А как его генерить? просто написать
emit dataChanged

или как?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Tonal
  опции профиля:
сообщение 20.8.2008, 13:39
Сообщение #6


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

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

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




Репутация:   17  


void MyModel::onNodeChange(const CMyClass& node) {
  QModelIndex curIndex = indByNode(node);
  emit dataChanged(curIndex, curIndex);
}

Где MyModel::indByNode вычисляет индекс в модели по экземпляру.

Сообщение отредактировал Tonal - 20.8.2008, 13:40
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Delphist
  опции профиля:
сообщение 21.8.2008, 8:27
Сообщение #7


Студент
*

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

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




Репутация:   0  


Цитата(Tonal @ 20.8.2008, 14:39) *
Где MyModel::indByNode вычисляет индекс в модели по экземпляру.

Спасибо для onNodeChange indByNode выглядит так:
void MyModel::modelChanged(int nCode, CSharedVariant &Value)
{
    QModelIndex curIndex;
//    curIndex = indByNode(Value, 0);
//    emit dataChanged(curIndex, curIndex);
    
    curIndex = indByNode(Value, 1);
    emit dataChanged(curIndex, curIndex);
}


QModelIndex MyMode::indByNode(CSharedVariant& node, int col)
{
    if (node.getOwner()) {
        int row = indexOf(node.getOwner(), &node);
        if (row == -1)
            return QModelIndex();
        return createIndex(row, col, &node);
    }
    return QModelIndex();
}

Вроде работает, но в не уверен на 100%.

Возникла еще одна проблема, а как тогда должен выглядить indByNode, если генерится событие onNodeDestroy(CMyClass& node, int col) т.е. удаляется элемент, в качестве node здесь передается удаляем элемент.

Сообщение отредактировал Delphist - 21.8.2008, 8:45
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
trdm
  опции профиля:
сообщение 21.8.2008, 10:13
Сообщение #8


Дмитрий Трошин
****

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

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




Репутация:   6  


посмотри сорцы QDirModel. мне помогло.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Delphist
  опции профиля:
сообщение 21.8.2008, 10:25
Сообщение #9


Студент
*

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

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




Репутация:   0  


Цитата(trdm @ 21.8.2008, 11:13) *
посмотри сорцы QDirModel. мне помогло.

смотрел не помагло
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Tonal
  опции профиля:
сообщение 21.8.2008, 10:31
Сообщение #10


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

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

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




Репутация:   17  


Открой ассистента и посмотри состав сигналов и защищённых функций QAbstractItemModel.
Там очень интуитивные названия и доходчиво написаны пояснения. :)
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

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


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




RSS Текстовая версия Сейчас: 3.3.2021, 8:04