PDA

View Full Version : drawing points on canvas after a time period



quickNitin
12th May 2006, 13:03
hello everybody,
I am currently using qt3.3.4.
here is a piece code i am presenting for help. It is supposed to put
points on canvas after a interval. Co-ordinate point are store in a 2d
matrix a[][].canvas is object refrence to QCanvas class .

void addPoint()
{
QPixmap bck=canvas.backGround();
QPixmap *tpix=new QPixmap(canvas.width(),canvas.height());
QPainter p;
QRect r(0,0,canvas.width(),canvas.height());
QPoint pt(0,0);
p.begin(tpix);
for (int i=0; i<10;i++)
for(int j=0; j<10; j++)
{
p.fillRect(0,0,canvas.width(),canvas.height(),Qt:: white);
p.setPen(Qt::red);
p.drawEllipse(a[i][j],a[i][j],3,3);
bitblt(&bck,pt,tpix,r,Qt::AndROP);
canvas.setBackGround(bck);
sleep(1);
}
p.end;
}
Here addPoint is a slot connected to menu item.Matrix a is being filled through a fifo.
but this code is printing line in one go only after waiting for some time.
What iwant is i can view plotting of each point aftera interval( here i put
1 in sleep) ; Someone advised me using Qtimer but souldn't find exact way.

I am thinking of creating a thread which will do the reading from fifo and main application will do the gui handling. Can i use pthread library inside qt. I haven't used QThread earlier. Also can i create a thread from inside a slot.
Any help will be appreciable
regards
nitin

jacek
12th May 2006, 13:11
What iwant is i can view plotting of each point aftera interval( here i put 1 in sleep) ;
QCanvas can animate objects all by itself. All you need is a QTimer connected to QCanvas::advance() and a class derived from QCanvasItem that will draw your object.


I am thinking of creating a thread which will do the reading from fifo and main application will do the gui handling. Can i use pthread library inside qt. I haven't used QThread earlier. Also can i create a thread from inside a slot.
QThread is much easier to use (you just have to subclass it and reimplement the run() method) and you can create it anywhere you want, just remember that you can't send signals between threads --- you must use custom events or some other mechanism.

http://doc.trolltech.com/3.3/threads.html

PS. Next time, please, don't ask two unrelated questions in a single thread --- create two threads instead.

quickNitin
12th May 2006, 13:56
thanks for answering
But QCanvas::advance() is or objectwhich are animated , i mean have some velocity set for them. I my case i have simple points acting as center for QCanvasEllipse. Current posted code is drawing but not after fixed time interval.

jacek
12th May 2006, 14:12
thanks for answering
But QCanvas::advance() is or objectwhich are animated , i mean have some velocity set for them. I my case i have simple points acting as center for QCanvasEllipse.
Then create a slot connected to QTimer::timeout() and create/show next QCanvasEllipse in it.


Current posted code is drawing but not after fixed time interval.
Your current code is wrong, because sleep() blocks the event loop and QCanvas can't redraw itself.