Russian Qt Forum
Ноябрь 24, 2024, 00:57 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: [РЕШЕНО] Тормозит QTableView  (Прочитано 7015 раз)
mutineer
Гость
« : Апрель 05, 2011, 12:38 »

Помогите пожалуйста.

Есть QTableView и модель, унаследованная от QAbstractTableModel. В модель довольно интенсивно добавляются данные. Добавленные данные тут же отображаются в QTableView.
В методе data(...) модели имеется следующий код:
Код:
if(Qt::DisplayRole != role)
        return QVariant();

Проблема в том, что таблица при наличии этих строк очень тормозит. Если же заменить эти строки на
Код:
if(Qt::DisplayRole != role)
        return "";
, то тормоза резко снижаются, но отображаются ненужные мне элементы. Возможно ли как-то уменьшить тормоза и почему вообще они появляются?
« Последнее редактирование: Апрель 11, 2011, 11:12 от mutineer » Записан
Пантер
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 5876


Жаждущий знаний


Просмотр профиля WWW
« Ответ #1 : Апрель 05, 2011, 12:44 »

Ты точно уверен, что эти строки виноваты? Я нет.
Записан

1. Qt - Qt Development Frameworks; QT - QuickTime
2. Не используйте в исходниках символы кириллицы!!!
3. Пользуйтесь тегом code при оформлении сообщений.
mutineer
Гость
« Ответ #2 : Апрель 05, 2011, 12:46 »

Ничего другого не трогаю, меняю только указанную строчку и эффект налицо
Записан
Пантер
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 5876


Жаждущий знаний


Просмотр профиля WWW
« Ответ #3 : Апрель 05, 2011, 12:48 »

Давай сюда полный код функции data.
Записан

1. Qt - Qt Development Frameworks; QT - QuickTime
2. Не используйте в исходниках символы кириллицы!!!
3. Пользуйтесь тегом code при оформлении сообщений.
mutineer
Гость
« Ответ #4 : Апрель 05, 2011, 12:53 »

Код:
QVariant CxMsgModel::data(const QModelIndex &index, int role) const
{
    if(Qt::DisplayRole != role)
        return QVariant();

    if(!index.isValid())
        return QVariant();

    if(!mMessages.contains(mnProcFilter))
        return QVariant();

    MessagesHash::const_iterator curProcess;
    curProcess = mMessages.find(mnProcFilter);
    ProcessesHash::iterator procInfo;
    procInfo = mpInfo->find(mnProcFilter);
    const MessageBody *pMsg(NULL);
    int i;
    switch(mFilterType)
    {
    case ftProcess:
        pMsg = &(curProcess->Messages[index.row()]);
        break;

    case ftScope:
        i = curProcess->Scopes.find(mnScopeFilter)->at(index.row());
        pMsg = &(curProcess->Messages[i]);
        break;

    default:
        break;
    }

    if(pMsg)
    {
        switch(index.column())
        {
        case 0:
            return procInfo->Scopes.find(pMsg->nScopeId)->sScopeName;

        case 1:
            return pMsg->Time.toString("hh:mm:ss.zzz");

        case 2:
            return pMsg->sBody;

        default:
            break;
        }

    }

    return QVariant();
}
Записан
Пантер
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 5876


Жаждущий знаний


Просмотр профиля WWW
« Ответ #5 : Апрель 05, 2011, 13:10 »

Цитировать
но отображаются ненужные мне элементы
Тут подробнее.
Записан

1. Qt - Qt Development Frameworks; QT - QuickTime
2. Не используйте в исходниках символы кириллицы!!!
3. Пользуйтесь тегом code при оформлении сообщений.
mutineer
Гость
« Ответ #6 : Апрель 05, 2011, 13:12 »

Если возвращать на остальные роли не QVariant(), а любое другое значение (например пустую строку), то view будет отрисовывать элементы, на роли которых запросил данные. То бишь у всех ячеек появляются чекбоксы, место под иконку, всплывающая подсказка и прочее
Записан
Пантер
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 5876


Жаждущий знаний


Просмотр профиля WWW
« Ответ #7 : Апрель 05, 2011, 13:15 »

Код
C++ (Qt)
if(Qt::DisplayRole != role) {
   return QAbstractItemModel::data (index, role);
}
 
Записан

1. Qt - Qt Development Frameworks; QT - QuickTime
2. Не используйте в исходниках символы кириллицы!!!
3. Пользуйтесь тегом code при оформлении сообщений.
mutineer
Гость
« Ответ #8 : Апрель 05, 2011, 13:20 »

Это чисто виртуальный метод, я не могу его вызвать
Записан
mutineer
Гость
« Ответ #9 : Апрель 11, 2011, 11:12 »

Разобрался. Тормозило из-за автоматической высоты строки
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.127 секунд. Запросов: 23.