crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )

 
Ответить в данную темуНачать новую тему
> QTableWidget для мониторинга данных, сильный расход ресурсов
Fitz
  опции профиля:
сообщение 8.6.2011, 17:40
Сообщение #1


Студент
*

Группа: Новичок
Сообщений: 13
Регистрация: 22.11.2010
Пользователь №: 2207

Спасибо сказали: 0 раз(а)




Репутация:   0  


На QMainWindow находится пару QTableWidget'ов для того, чтобы раз в полсекунды выводить в них некоторый массив данных. QTableWidget используются только для отображения, редактировать их нельзя.


Для заполнения одной строчки таблицы использую следующую процедуру:
Раскрывающийся текст

void MainWindow::fillTable(MEAS_PARAM AllData, bool evalFlag, QTableWidget *tw, int row)
{
    QString out;
    QTableWidgetItem *newValidity = new QTableWidgetItem();
    QTableWidgetItem *newData = new QTableWidgetItem();
    QTableWidgetItem *newData2 = new QTableWidgetItem();
    QTableWidgetItem *newAverage = new QTableWidgetItem();
    QTableWidgetItem *newSCE = new QTableWidgetItem();
    QTableWidgetItem *newAMSD = new QTableWidgetItem();
    QTableWidgetItem *newRCE = new QTableWidgetItem();
    QTableWidgetItem *newMCE = new QTableWidgetItem();
      // Выравнивание по правому краю
      newValidity->setTextAlignment(Qt::AlignRight);
      newData->setTextAlignment(Qt::AlignRight);
      newData2->setTextAlignment(Qt::AlignRight);
      newAverage->setTextAlignment(Qt::AlignRight);
      newSCE->setTextAlignment(Qt::AlignRight);
      newAMSD->setTextAlignment(Qt::AlignRight);
      newRCE->setTextAlignment(Qt::AlignRight);
      newMCE->setTextAlignment(Qt::AlignRight);
           // Validity
            txtBInput->append(" ");
            newValidity->setText(QString::number(AllData.Meas.Validity, 10).toUpper());
            tw->setItem(row, 0, newValidity);
            txtBInput->insertPlainText(QString::number(AllData.Meas.Validity, 10).toUpper());
           // Data.dotResult
            txtBInput->insertPlainText("|");
            out.setNum((AllData.Meas.Data.dotResult),'f', 4);
            newData->setText(out);
            newData->setToolTip(QString::number(AllData.Meas.Data.dotResult,'g', 4));
            tw->setItem(row, 1, newData);
            txtBInput->insertPlainText(out);
           // Data2
            txtBInput->insertPlainText("|");
            newData2->setText(QString::number(AllData.Meas.Data2, 10).toUpper());
            tw->setItem(row, 2, newData2);
            txtBInput->insertPlainText(QString::number(AllData.Meas.Data2, 10).toUpper());
        if(AllData.Meas.Validity == 0)
            {
               // Average
                out.setNum(AllData.Average,'f', 4);
                newAverage->setText(out);
                newAverage->setToolTip(QString::number(AllData.Average,'g', 4).toUpper());
                tw->setItem(row, 3, newAverage);
              // MCE
                out.setNum(AllData.MCE,'f', 4);
                newMCE->setText(out);
                newMCE->setToolTip(QString::number(AllData.MCE,'g', 4).toUpper());
                tw->setItem(row, 4, newMCE);
               // SCE
                out.setNum(AllData.SCE,'f', 4);
                newSCE->setText(out);
                newSCE->setToolTip(QString::number(AllData.SCE,'g', 4).toUpper());
                tw->setItem(row, 5, newSCE);
               // RCE
                out.setNum(AllData.RCE,'f', 4);
                newRCE->setText(out);
                newRCE->setToolTip(QString::number(AllData.RCE,'g', 4).toUpper());
                tw->setItem(row, 6, newRCE);
               // AMSD
                out.setNum(AllData.AMSD,'f', 4);
                newAMSD->setText(out);
                newAMSD->setToolTip(QString::number(AllData.AMSD,'g', 4).toUpper());
                tw->setItem(row, 7, newAMSD);
            }
        else
            {
                 newAverage->setText("error");
                 newMCE->setText("error");
                 newSCE->setText("error");
                 newRCE->setText("error");
                 newAMSD->setText("error");
                 tw->setItem(row, 3, newAverage);
                 tw->setItem(row, 4, newMCE);
                 tw->setItem(row, 5, newSCE);
                 tw->setItem(row, 6, newRCE);
                 tw->setItem(row, 7, newAMSD);
            }
        // подкрашиваем ячейку
        if(evalFlag == true)
            {
                newAverage->setTextColor(colorForIds[3]);
                newSCE->setTextColor(colorForIds[3]);
                newAMSD->setTextColor(colorForIds[3]);
                newRCE->setTextColor(colorForIds[3]);
                newMCE->setTextColor(colorForIds[3]);
            }
        else
            {
                newAverage->setTextColor(colorForIds[1]);
                newSCE->setTextColor(colorForIds[1]);
                newAMSD->setTextColor(colorForIds[1]);
                newRCE->setTextColor(colorForIds[1]);
                newMCE->setTextColor(colorForIds[1]);
            }
}


Загрузка процессора при этом ~40%, gui приложения безбожно тормозит и похоже таймер из класса приема данных из внешнего устройства периодически заваливается и не передает их в слот основного класса.
Изначально и подумать не мог, что QTableWidget окажется причиной такого поведения. Пытался найти ошибку в общении с внешним устройством, расчетах или провальные места в работе с контейнерами, но стоило убрать вывод половины значений в таблицу, программа начинала работать в разы быстрее.
Возможно необходимо работать с этим виджетом совершенно по-другому или вообще использовать иной виджет для этой задачи.
help
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 8.6.2011, 17:54
Сообщение #2


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9668
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

Спасибо сказали: 807 раз(а)




Репутация:   94  


используй Модель/представление. Эти вспомогательные виджеты предназначены для примитивных вещей
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Алексей1153
  опции профиля:
сообщение 8.6.2011, 19:16
Сообщение #3


фрилансер
******

Группа: Участник
Сообщений: 2928
Регистрация: 19.6.2010
Из: Обливион
Пользователь №: 1822

Спасибо сказали: 215 раз(а)




Репутация:   34  


а когда окно не показано на экране, тормоза остаются ?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Fitz
  опции профиля:
сообщение 10.6.2011, 11:07
Сообщение #4


Студент
*

Группа: Новичок
Сообщений: 13
Регистрация: 22.11.2010
Пользователь №: 2207

Спасибо сказали: 0 раз(а)




Репутация:   0  


Цитата(Алексей1153 @ 8.6.2011, 20:16) *
а когда окно не показано на экране, тормоза остаются ?

Практически нет. Например имеющийся на этой же форме QSlider иногда спотыкается во время передвижения и все.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Алексей1153
  опции профиля:
сообщение 10.6.2011, 11:11
Сообщение #5


фрилансер
******

Группа: Участник
Сообщений: 2928
Регистрация: 19.6.2010
Из: Обливион
Пользователь №: 1822

Спасибо сказали: 215 раз(а)




Репутация:   34  


Если таблица неинтерактивная, нарисуй сетку сам, да сделай распечатку цветных циферок в ячейках. Будет летать :)

Ещё вариант - в момент заполнения той таблицы отключай автоперерисовку (если есть), а после заполнения включай обратно. Должна такая штука быть по любому
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Гость_Гость_*
сообщение 11.6.2011, 22:06
Сообщение #6





Гости








    


Цитата(Litkevich Yuriy @ 8.6.2011, 17:54) *
используй Модель/представление. Эти вспомогательные виджеты предназначены для примитивных вещей


Самый дельный совет.

Прорисовывается только только видимая часть Дорисовывается по мере прокрутки.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Fitz
  опции профиля:
сообщение 22.6.2011, 12:34
Сообщение #7


Студент
*

Группа: Новичок
Сообщений: 13
Регистрация: 22.11.2010
Пользователь №: 2207

Спасибо сказали: 0 раз(а)




Репутация:   0  


Нарисовал таблицу руками через paintEvent, после каждого появления данных для отображения вызываю this->update() и в paintEvent'e перерисовываю табличку. Все залетало.
Но возник следующий баг. При открытии QFileDialog:

      const QString fileName = QFileDialog::getOpenFileName(
                     this,
                     tr("open File"),
                     QDir::currentPath(),
                     tr("Firmware Files (*.bin *.hex)") );


Окно выбора файла начинает вести себя неадекватно, не отрисовываются иконки, пропадает список папок и прочие графические артефакты.

P.S. Вероятно лучше действительно сделать через Модель/представление, но по документации я не понял, в чем соль. Или необходимо свой виджет писать для представления?
Через простое рисование получилось проще, но это все-таки попахивает костылями.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
skmdeveloper
  опции профиля:
сообщение 23.6.2011, 12:57
Сообщение #8


Студент
*

Группа: Участник
Сообщений: 23
Регистрация: 18.9.2009
Пользователь №: 1107

Спасибо сказали: 0 раз(а)




Репутация:   0  


Виджет можно не писать? использовать QTtableView нужно написать класс модели, унаследованной от QAbstractTableModel.

Например так:

 class ImageModel : public QAbstractTableModel
{
     Q_OBJECT

public:
     ImageModel(QObject *parent = 0);

     void setImage(const QImage &image);
// Эти функции нужно переопределить
     int rowCount(const QModelIndex &parent = QModelIndex()) const;
     int columnCount(const QModelIndex &parent = QModelIndex()) const;

     QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const;
     QVariant headerData(int section, Qt::Orientation orientation, int role = Qt::DisplayRole) const;
//------------------------------------------------------------
private:
     QImage modelImage;
};


http://doc.qt.nokia.com/latest/itemviews-pixelator.html

Сообщение отредактировал skmdeveloper - 23.6.2011, 12:58
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Fitz
  опции профиля:
сообщение 14.7.2011, 17:05
Сообщение #9


Студент
*

Группа: Новичок
Сообщений: 13
Регистрация: 22.11.2010
Пользователь №: 2207

Спасибо сказали: 0 раз(а)




Репутация:   0  


Соорудил модель-представление, все залетало как надо.
Всем спасибо.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

Быстрый ответОтветить в данную темуНачать новую тему
Теги
Нет тегов для показа


1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0




RSS Текстовая версия Сейчас: 23.9.2021, 12:01