PDA

View Full Version : [qt4.1,win,g++] Using QPainter outside paintEvent()



jh
4th February 2006, 00:42
hi,

how can i draw on a widget outside method paintevent() ?
in the following code the lines are drawn in paintevent(9 but not
in mousemoveevent(). i tried several attributes such as
Qt::WA_PaintOutsidePaintEvent but without success.


void paintEvent(QPaintEvent *e)
{
QLabel::paintEvent(e);
QPainter p(this);
p.setPen(QColor(146, 146, 146));
p.drawRect(0, 0, width() - 5, height() - 5);
}


virtual void mouseMoveEvent ( QMouseEvent * e )
{
QPainter p(this);
QPen pen;
pen.setColor(QColor(200,100,30));
p.setPen( pen );
p.drawLine(QPoint(0,0),e->pos());
p.drawLine(0,0,100,60);
}


any ideas?

jh

jacek
4th February 2006, 00:51
Is that mouseMoveEvent() method being invoked at all?

jh
4th February 2006, 01:23
yes it is. i put some printf's in it to test it (which i just
deleted in the posting)

the method mousemoveevent is called.

in each tutorial and example i found so far the painting is always done
in paintevent. is there anything done by qt internally before paintevent
is called which i have to do before painting (outside paintevent) ?

jh

jacek
4th February 2006, 02:06
The docs for Qt::WA_PaintOutsidePaintEvent say:
Makes it possible to use QPainter to paint on the widget outside paintEvent(). This is not supported on Mac OS X. We recommend that you use this attribute only when porting Qt 3 code to Qt 4.
How did you set this attribute?

jh
4th February 2006, 12:06
i set this attribute by calling setAttribute like this:

virtual void mouseMoveEvent ( QMouseEvent * e )
{

setAttribute(Qt::WA_PaintOutsidePaintEvent, true);

QPainter p(this);
QPen pen;
pen.setColor(QColor(200,100,30));
p.setPen( pen );
p.drawLine(QPoint(0,0),e->pos());
p.drawLine(0,0,100,60);

}


regards,
jh

jacek
4th February 2006, 14:24
Did you try setting it in the constructor?

jh
4th February 2006, 14:44
yes. i also tried that.

jh

jacek
4th February 2006, 15:37
Is this a normal widget or does it use OpenGL?

jh
4th February 2006, 15:49
it's a normal widget derived from qlabel:



class PaintTest : public QLabel
{

public:

PaintTest( const QString & text, QWidget * parent = 0, Qt::WFlags f = 0 )
: QLabel(text,parent,f)
{
setAttribute(Qt::WA_PaintOutsidePaintEvent,true);
}

protected:

void ppp()
{
QPainter p(this);
// setAttribute(Qt::WA_PaintOutsidePaintEvent,true);
QPen pen(Qt::DashLine);
pen.setColor(Qt::red);
// p.s0etCompositionMode(QPainter::CompositionMode_Xo r);
p.setPen( pen );
p.drawLine(QPoint(0,0),QPoint(50,70));
p.drawLine(0,0,100,100);
printf("jdhfjkdshfjkhds\n");
fflush(stdout);
}

void paintEvent(QPaintEvent *e)
{
QLabel::paintEvent(e);

QPainter p(this);
p.setPen(QColor(146, 146, 146));
p.drawRect(0, 0, width() - 5, height() - 5);

printf("paintEvent\n");
fflush(stdout);

}



virtual void mouseMoveEvent ( QMouseEvent * e )
{

setAttribute(Qt::WA_PaintOutsidePaintEvent, true);

QPainter p(this);
QPen pen;
pen.setColor(QColor(200,100,30));
p.setPen( pen );
p.drawLine(QPoint(0,0),e->pos());
p.drawLine(0,0,100,60);

// repaint(10,10,50,60);

printf("mouseMoveEvent\n");
fflush(stdout);

}

};

jh

jacek
4th February 2006, 17:14
It seems to work on my system (PLD Linux, Qt 4.1.0). See the attached image.

PS. Please, use [ code ] tags to make your code readable.

jh
4th February 2006, 21:58
hm ...
linux / win32 - OpSystem problem ?? strange.

if anybody gets this working on win32, let me know!

jh

jacek
4th February 2006, 22:23
linux / win32 - OpSystem problem ?
Yes, looks like a Qt bug.

http://www.trolltech.com/developer/tasktracker.html?method=entry&id=83522

jh
5th February 2006, 11:34
ok, so it's not due to my incompetence ;)

i'll wait till 4.1.1

thanx for the hint.

jh