Делаю следующее. Написал свою модель от 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();
}