[SOLVED] PaintEvent, drawing many dots/points using Array.
-
wrote on 6 Dec 2012, 11:17 last edited by
Hey, I need little help with my script
so far I coded a dot, that moves from left to right.
HEADER
@class Lines : public QWidget
{
Q_OBJECTQTimer *timer1;
public:
Lines(QWidget *parent = 0);
int timer_interval;protected:
void paintEvent(QPaintEvent *event);
void drawLines(QPainter *qp);
public slots:
void call_repaint();};@
MAIN
@Lines::Lines(QWidget *parent) : QWidget(parent)
{timer_interval=0; timer1=new QTimer(this); timer1->setInterval(100); timer1->start(); connect(timer1, SIGNAL(timeout()), this, SLOT(call_repaint()));
}
void Lines::paintEvent(QPaintEvent *e)
{
Q_UNUSED(e);
QPainter qp(this);
drawLines(&qp);
}void Lines::call_repaint(){repaint();}
void Lines::drawLines(QPainter *qp)
{
timer_interval++;QPen pen(Qt::black, 2, Qt::SolidLine);
qp->setPen(pen);
qp->drawPoint(2+timer_interval,50);
}@This is working fine, but I want instead one dot moving, many dots next to each other, so the dots are making a line or any kind of graph.
So long story short, I need an Array of the Paintevent or something, how to do this?
e.g.
first dot/point is on coordinate (10,10)
next one is on (10,11)
next one is on (10,12)
... -
wrote on 6 Dec 2012, 11:44 last edited by
Hi,
typically, the paint event repaints everything. It could also happen after the window was covered by another window. So if you really want to draw a line, move one end point and leave the starting point where it is.
If it should be dots, use an array.
-
wrote on 6 Dec 2012, 11:48 last edited by
@If it should be dots, use an array.@
-___-
yea, but how do I do this?if I do like this, nothing is drawn
@ QPainter paint_array[10];
drawLines(&paint_array[0]);@
I want to draw a graph/curve, so I need to manipulate every single dot,
using a line is not an option for me -
wrote on 6 Dec 2012, 12:02 last edited by
Hi! You dont have to create multiple QPainter objects or multiple painter events, you need to draw multiple dots using one painter inside one painter event, smthng like this:
@void Lines::drawLines(QPainter *qp)
{
timer_interval++;QPen pen(Qt::black, 2, Qt::SolidLine);
qp->setPen(pen);
for(int i = 0; i < 50; i++){
qp->drawPoint(2+timer_interval,50+i);
}
}@ -
wrote on 6 Dec 2012, 12:09 last edited by
Store the points in a member vector and use that for drawing:
@
class Lines : public QWidget
{
Q_OBJECTQTimer *timer1; QVector<QPoint> m_points; // <<-- new
public:
Lines(QWidget *parent = 0);
int timer_interval;protected:
void paintEvent(QPaintEvent *event);
void drawLines(QPainter *qp);
public slots:
void call_repaint();};
@in the cpp:
@
void Lines::call_repaint()
{
// <<-- new start
timer_interval++;
m_points.append(QPoint(2+timer_interval,50));
// <<-- new end
repaint();
}void Lines::drawLines(QPainter *qp)
{
QPen pen(Qt::black, 2, Qt::SolidLine);
qp->setPen(pen);// <<-- new start QPoint pt; foreach(pt, m_points) { qp->drawPoint(pt); } // <<-- new end
}
@ -
wrote on 6 Dec 2012, 12:40 last edited by
Wow thanks Gerolf,
surprisingly, this is working as I want, though I dont really understand how you set it up.
if you have little time, you may want to explain this in few words.@ QVector<QPoint> m_points; // << What did you do right here, never seen this <QPoint> before an variable @
and this one here
@ QPoint pt;
foreach(pt, m_points)
{
qp->drawPoint(pt);
}@ -
wrote on 6 Dec 2012, 16:11 last edited by
ok anyway, just marked it as solved.
thanks again
-
wrote on 6 Dec 2012, 16:29 last edited by
Hi MrNoway,
You should have a look at the docs for these classes :-)
- QPoint is just what the name says, a point. x and y.
- A QVector<QPoint> is a dynamic array of QPoint objects
- foreach is a for each loop (shortcut for for(i = 0; i < vec.count(), ++i) {pt = vec[i]; ...)
These are helpers that Qt provides the users :-)
1/8