Russian Qt Forum

Qt => 2D и 3D графика => Тема начата: rainman от Апрель 01, 2011, 19:31



Название: динамическое отображение данных
Отправлено: 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% .