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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: Обновление данных в таблице  (Прочитано 1981 раз)
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();
}
Записан
kibsoft
Хакер
*****
Offline Offline

Сообщений: 625


Просмотр профиля WWW
« Ответ #1 : Май 16, 2014, 22:02 »

Наследоваться от QAbstractTableModel и код изменения модели обернуть в
Код:
beginResetModel();
код изменения данных в модели
endResetModel();

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

http://kibsoft.ru - Download the Qt Media Encoding Library here

The apps that were written using QtMEL:
http://srecorder.com - Screen recording software
cub4d
Гость
« Ответ #2 : Май 16, 2014, 23:43 »

Уже разобрался. Проблема была в том, что не отправлял сигнал dataChanged() в методе setData(). Но всё-равно спасибо, ваше решение тоже работает, возьму на заметку)
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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