crossplatform.ru

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

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
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

Сообщений в этой теме


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


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


RSS Рейтинг@Mail.ru Текстовая версия Сейчас: 16.6.2025, 1:00