Russian Qt Forum

Qt => Model-View (MV) => Тема начата: mutineer от Апрель 05, 2011, 12:38



Название: [РЕШЕНО] Тормозит QTableView
Отправлено: mutineer от Апрель 05, 2011, 12:38
Помогите пожалуйста.

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

Проблема в том, что таблица при наличии этих строк очень тормозит. Если же заменить эти строки на
Код:
if(Qt::DisplayRole != role)
        return "";
, то тормоза резко снижаются, но отображаются ненужные мне элементы. Возможно ли как-то уменьшить тормоза и почему вообще они появляются?


Название: Re: Тормозит QTableView
Отправлено: Пантер от Апрель 05, 2011, 12:44
Ты точно уверен, что эти строки виноваты? Я нет.


Название: Re: Тормозит QTableView
Отправлено: mutineer от Апрель 05, 2011, 12:46
Ничего другого не трогаю, меняю только указанную строчку и эффект налицо


Название: Re: Тормозит QTableView
Отправлено: Пантер от Апрель 05, 2011, 12:48
Давай сюда полный код функции data.


Название: Re: Тормозит QTableView
Отправлено: mutineer от Апрель 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();
}


Название: Re: Тормозит QTableView
Отправлено: Пантер от Апрель 05, 2011, 13:10
Цитировать
но отображаются ненужные мне элементы
Тут подробнее.


Название: Re: Тормозит QTableView
Отправлено: mutineer от Апрель 05, 2011, 13:12
Если возвращать на остальные роли не QVariant(), а любое другое значение (например пустую строку), то view будет отрисовывать элементы, на роли которых запросил данные. То бишь у всех ячеек появляются чекбоксы, место под иконку, всплывающая подсказка и прочее


Название: Re: Тормозит QTableView
Отправлено: Пантер от Апрель 05, 2011, 13:15
Код
C++ (Qt)
if(Qt::DisplayRole != role) {
   return QAbstractItemModel::data (index, role);
}
 


Название: Re: Тормозит QTableView
Отправлено: mutineer от Апрель 05, 2011, 13:20
Это чисто виртуальный метод, я не могу его вызвать


Название: Re: Тормозит QTableView
Отправлено: mutineer от Апрель 11, 2011, 11:12
Разобрался. Тормозило из-за автоматической высоты строки