собрал минимальный прототип. в 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();
}