Solved Analysing simple codesnips
-
@tomy
well
painter.fillRect(r2, QColor("#FFBB33"));
would indeed be same as
painter.fillRect(QRect(0,0,40,40), QColor("#FFBB33"));
and would paint in corner. and never move.however, if you modify the r2 BEFORE painting with it, (with r2.moveCenter(r1.center()); )
the r2 rect would be changed. and paint in other location.But im not sure what you doubts still are ?
if you omit moveCenter, r2 is unchanged.
If you apply moveCenter, its changed.
if you paint with r2, BEFORE you change it,
nothing will happen with moveCenter as the fillRect was already run. -
@mrjj
Got it, thank you.Each time the mouse is clicked, all the statements of the paintEvent method are run, while only the if condition and painter are needed to be re-run each time.
The code looks raw or, as Stroustrup says, ugly. Is it not? -
@tomy
Hi
Well its not for sure a mousePress event will cause a widget to repaint.
But for say for a QPushButton it will so button can draw as pressed.
Its pretty basic painting with one color rectangle.
Much widgets have much more complicated paint code. -
Well its not for sure a mousePress event will cause a widget to repaint.
For example, we click on different areas of the widget for five times and the r2 rectangle traces us, how many times will the method paintEvent be called?
If five times, so in each call, all the statements inside the method are called. Isn't it?
-
@tomy
Hi
if the r2 follows it does mean for each click, the paint is called.
i assume there is an update() in mousePressEvent/release.
yes all code in painteEvent is run each time. -
@mrjj
Hi, good morning. :)Yes, r2 follows the click presses and there's an update() which makes it happen by re-calling painEvent each time.
My assumption was that, the part of paintEvent below is useful only for the first time when the program runs.QPainter painter(this); QRect r1 = rect().adjusted(10, 10, -10, -10); painter.setPen(QColor("#33B5E5")); painter.drawRect(r1); QRect r2(QPoint(0, 0), QSize(40, 40));
Afterwards when the user clicks different locations on the widget, only the following section is needed and the above one will be excessive.
if(m_lastPos.isNull()) r2.moveCenter(r1.center()); else r2.moveCenter(m_lastPos); painter.fillRect(r2, QColor("#FFBB33")); }
Disagree?
-
@tomy
Hi and good morning
it doesn't really work that way.
You need all of the paint code each time. -
One reason is that QPainter must be in the following code,
QPainter painter(this); QRect r1 = rect().adjusted(10, 10, -10, -10); painter.setPen(QColor("#33B5E5")); painter.drawRect(r1); QRect r2(QPoint(0, 0), QSize(40, 40));
because it doesn't work somewhere else, as you said.
What remains is the rectangles, r1, r2. Couldn't we define them somewhere else and only use them in that code? -
@tomy
Hi
yes Painter only works in paintEvent ( you can also draw on pixmap with it as only other case)You could have r1 and r2 as members of the class but if the window can be resized,
then you want to call rect() each time anyway to make sure to use right size.
So im not sure there would be any benefit to store the rects.
However, color and fonts and images and such things should be stored in class and
not loaded/created each time. -
@mrjj
OK, thanks so much.