Название: динамическое отображение данных
Отправлено: rainman от Апрель 01, 2011, 19:31
Здравствуйте всем! Есть задача - приложение получает поток данных в реальном времени, приложение должно отображать в реальном времени данные в виде графика(по типу временного окна). Вопрос - какой метод применить? пробовал QWidget - QPaint Event, QGraphicsView- QGraphicsScene, QLabel->setPixmap. Программа под линукс и при времени перерисовывания меньше 100 мс сильно тормозит процессор. Какой метод наименее затратный?Навороты типа ресайза,скролла не нужны - только отображение таблично заданной функции, все что можно сделать руками сделаю руками.
Название: Re: динамическое отображение данных
Отправлено: madRoger от Апрель 01, 2011, 19:35
А может вообще отказаться от всех этих методов. Для работы с графиками в qt есть сторонняя библиотека qwt.
Название: Re: динамическое отображение данных
Отправлено: rainman от Апрель 02, 2011, 21:15
собрал минимальный прототип. в winXP грузит процессор на 1%, в linux MOPS-7.0 на 100%. методом исключения определил, что грузит строка drawPolyline в paintEvent. может кто подскажет способ рисования с меньшими затратами? //gview.h #ifndef GVIEW_H #define GVIEW_H
#include <QWidget> #include <QPainter> //#include <QDebug> #include <QTimerEvent> class Gview : public QWidget { Q_OBJECT
public: Gview(QWidget *parent = 0); ~Gview(); void setIndex(const int); void setStep(const int); void setData(const QVector<int> &); void setPen(const QPen&); protected slots: void paintEvent(QPaintEvent *); void timerEvent(QTimerEvent *); private: QVector<int> ringBuffer; int ringIndex; int ringStep; QPen pen;
}; #endif // GVIEW_H
//gview.cpp #include "gview.h"
Gview::Gview(QWidget *parent) : QWidget(parent) { ringIndex = -1; ringStep = 1;
QPixmap pm(50,50); pm.fill(QColor(230,230,230)); QPolygon pl; pl << QPoint(0,0)<<QPoint(0,50)<<QPoint(0,0)<<QPoint(50,0); QPen pen; pen.setWidthF(0.1); QPainter p; p.begin(&pm); p.setPen(pen); p.drawLines(pl); p.end(); QPalette pal = palette(); pal.setBrush(this->backgroundRole(),QBrush(QPixmap(pm))); setPalette(pal);
startTimer(40); }
Gview::~Gview() { }
void Gview::paintEvent(QPaintEvent *) { QPolygon pl; int size = ringBuffer.size(); for (int i = 0; i< size; i++) { int j = (ringIndex + i)%size; pl << QPoint(i,ringBuffer.at(j)); } QPainter p; p.begin(this); p.setPen(pen); p.drawPolyline(pl); //p.drawPoints(pl); p.end(); }
void Gview::timerEvent(QTimerEvent *) { ringIndex += ringStep; ringIndex %=ringBuffer.size(); update(); }
void Gview::setPen(const QPen& value) { pen = value; }
void Gview::setData(const QVector<int>& v) { ringBuffer = v; }
void Gview::setIndex(const int value) { ringIndex = value; }
void Gview::setStep(const int value) { ringStep = value; }
//main.cpp #include <QApplication> #include "gview.h"
int main(int argc, char *argv[]) { QApplication a(argc, argv);
QVector<int> v; for (int i = 0; i < 800; i ++) v << rand()%200 + 150;
Gview view; view.setFixedSize(800,500); view.move(0,0); view.setData(v); view.setPen(QPen(QBrush(Qt::darkCyan),1,Qt::SolidLine)); view.setStep(2);; view.show(); return a.exec(); }
Название: Re: динамическое отображение данных
Отправлено: rainman от Апрель 05, 2011, 08:26
должен сказать спасибо madRoger. После допиливания /qwt/examples/refreshtest получил вполне приемлемый результат. Загрузка процессора при 100 Fps - 20% .
|