[Qt-interest] How to paint the Background of QImage without loosing its Foreground Contents.

John McClurkin jwm at nei.nih.gov
Fri Jul 31 20:05:12 CEST 2009


varun singh wrote:
> hi,
> 
>   Well, i'm trying to make a painting application. I'm getting some trouble with setting the background color.
> 
>   I've QImage object as my painting space, hence i used QImage->fill() fuction to fill the QImage with a particular color.
> 
>   But, if i scribble something on QImage (with Pen) and then use fill function, it clears everything n fills the image with the new color (well, that's obvious)...
> 
>   Hence I've run nested for loops to access each pixel of Qimage and check whether it is already colored with Pen, if it is not then i call setPixel() function to color it with background color. 
> 
>   But its not working, each pixel is still getting painted.
> 
> Here is the code
> 
> ******************************************************************************
> //mBColor is of type QRgb.
> void PaintWidget::setBColor(QRgb color) //sets the Background Color
> {
>     mBColor = color;
>     int x, y;
>     for(x = 0; x <= mPaintImage->width() - 1; x++) 
>     {
>         for(y = 0; y <= mPaintImage->height() - 1; y++)
>         {
>             if(QColor(mPaintImage->pixel(x, y)) != mFColor) //mFColor is 
>             {                                               //Foregournd 
>                 mPaintImage->setPixel(x, y, mBColor);       //Ccolor.  
>             }
>         }
>     }
>    emit bColorChanged(mBColor);
>    update();
> }
> 
> *******************************************************************************
> 
>   I'm Desperately looking for some help.
> 

Well, your code looks good so the most obvious explanation is that the 
QColor that is created by your call
	QColor(mPaintImage->pixel(x, y))
is different from mFColor, even when the pixel in mPaintImage was 
colored by mFColor. You are probably going to have to single step this 
in a debugger and check values, possibly even (God forbid) dump the 
mPaintImage pixel values to a text file. You might try something like:

for(y = 0; y <= mPaintImage->height() - 1; y++)
{
     pColor = QColor(mPaintImage->pixel(x, y);
     if(pColor != mFColor)
     {
	mPaintImage->setPixel(x, y, mBColor);
     }
}

Putting a break point on the if statement would let you examine both 
pColor and mFColor. Grueling work. Glad I don't have to do it.



More information about the Qt-interest-old mailing list