Russian Qt Forum

Qt => Вопросы новичков => Тема начата: cub4d от Май 16, 2014, 21:18



Название: Обновление данных в таблице
Отправлено: cub4d от Май 16, 2014, 21:18
Делаю следующее. Написал свою модель от QAbstractTableModel. Привязал к QTableView. По таймеру (0.5 сек) обновляю список процессов и заношу в таблицу, при этом вычисляя разницу между предыдущем и обновленным списком процессов и, в соответствии с этой разницей, добавляю или удаляю строки в таблице, а затем перезаписываю данные. Проблема в следующем: при отображении таблицы, данные никак не меняются (например процент использования CPU, который обновляется достаточно интенсивно для некоторых процессов). Однако, если выделить строку или проскроллить таблицу туда-сюда, то они обновляются... Какая-то проблема с отрисовкой что-ли) Как это исправить? Заранее благодарен)

Код:
void ProcessMonitor::updateProcessList()
{
    QDir *dir = new QDir("/proc");
    QStringList dirProcessList = dir->entryList(QStringList("*"), QDir::AllDirs);
    QFile stat;

    int len = processList.size();

    processList.clear();
    foreach(QString str, dirProcessList)
    {
        if (str.toInt())
        {
            stat.setFileName("/proc/" + str.toUtf8() + "/stat");
            stat.open(QIODevice::ReadOnly);

            processList.append(getProcessInfoByStat(&stat));

            stat.close();
        }
        else continue;
    }

    int dif = len - processList.size();

    if (dif < 0)
    {
        processTableModel->insertRows(0, -dif, QModelIndex());
    }
    else if (dif > 0)
    {
        processTableModel->removeRows(0,  dif, QModelIndex());
    }

    for (int i = 0; i < processList.size(); i++)
    {
        processTableModel->setData(processTableModel->index(i, 0), processList.at(i)->comm,  Qt::DisplayRole);
        processTableModel->setData(processTableModel->index(i, 1), processList.at(i)->pid,   Qt::DisplayRole);
        processTableModel->setData(processTableModel->index(i, 2), processList.at(i)->stat,  Qt::DisplayRole);
        processTableModel->setData(processTableModel->index(i, 3), processList.at(i)->nice,  Qt::DisplayRole);
        processTableModel->setData(processTableModel->index(i, 4), processList.at(i)->cpu,   Qt::DisplayRole);
        processTableModel->setData(processTableModel->index(i, 5), processList.at(i)->stime, Qt::DisplayRole);
    }

    sort();
}


Название: Re: Обновление данных в таблице
Отправлено: kibsoft от Май 16, 2014, 22:02
Наследоваться от QAbstractTableModel и код изменения модели обернуть в
Код:
beginResetModel();
код изменения данных в модели
endResetModel();

Таким образом, данные будут перезапрашиваться вьюшкой и соответственно обновляться/отрисовываться.


Название: Re: Обновление данных в таблице
Отправлено: cub4d от Май 16, 2014, 23:43
Уже разобрался. Проблема была в том, что не отправлял сигнал dataChanged() в методе setData(). Но всё-равно спасибо, ваше решение тоже работает, возьму на заметку)