crossplatform.ru

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


  Ответ в QTableWidget для мониторинга данных
Введите ваше имя
Подтвердите код

Введите в поле код из 6 символов, отображенных в виде изображения. Если вы не можете прочитать код с изображения, нажмите на изображение для генерации нового кода.
 

Опции сообщения
 Включить смайлы?
Иконки сообщения
(Опционально)
                                
                                
  [ Без иконки ]
 


Последние 10 сообщений [ в обратном порядке ]
Fitz Дата 14.7.2011, 17:05
  Соорудил модель-представление, все залетало как надо.
Всем спасибо.
skmdeveloper Дата 23.6.2011, 12:57
  Виджет можно не писать? использовать 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
Fitz Дата 22.6.2011, 12:34
  Нарисовал таблицу руками через paintEvent, после каждого появления данных для отображения вызываю this->update() и в paintEvent'e перерисовываю табличку. Все залетало.
Но возник следующий баг. При открытии QFileDialog:

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


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

P.S. Вероятно лучше действительно сделать через Модель/представление, но по документации я не понял, в чем соль. Или необходимо свой виджет писать для представления?
Через простое рисование получилось проще, но это все-таки попахивает костылями.
Гость Дата 11.6.2011, 22:06
 
Цитата(Litkevich Yuriy @ 8.6.2011, 17:54) *
используй Модель/представление. Эти вспомогательные виджеты предназначены для примитивных вещей


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

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

Ещё вариант - в момент заполнения той таблицы отключай автоперерисовку (если есть), а после заполнения включай обратно. Должна такая штука быть по любому
Fitz Дата 10.6.2011, 11:07
 
Цитата(Алексей1153 @ 8.6.2011, 20:16) *
а когда окно не показано на экране, тормоза остаются ?

Практически нет. Например имеющийся на этой же форме QSlider иногда спотыкается во время передвижения и все.
Алексей1153 Дата 8.6.2011, 19:16
  а когда окно не показано на экране, тормоза остаются ?
Litkevich Yuriy Дата 8.6.2011, 17:54
  используй Модель/представление. Эти вспомогательные виджеты предназначены для примитивных вещей
Fitz Дата 8.6.2011, 17:40
  На 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
Просмотр темы полностью (откроется в новом окне)
RSS Текстовая версия Сейчас: 29.3.2024, 18:15