Beyond QPainter::setBrush() - Alternative Filling Techniques in Qt


Purpose

  • The setBrush() function of QPainter sets the brush that will be used to fill the interior of shapes subsequently drawn with the painter.
  • In Qt GUI programming, QPainter is a fundamental class used for drawing various graphical elements.

Brush Types

  • A brush in Qt defines the color or pattern used for filling shapes. Qt provides various brush styles:
    • Solid color brushes (using QColor)
    • Gradient brushes (linear, radial, conical) for creating smooth color transitions
    • Texture brushes for applying an image pattern
    • Pattern brushes for repeating a smaller image tile

Setting the Brush

#include <QtGui/QPainter>
#include <QtGui/QBrush>

// ...

QPainter painter(&widget);  // Create a painter for the widget

// Set a solid color brush
QColor red(255, 0, 0);  // Create a red color
QBrush brush(red);
painter.setBrush(brush);

// Draw a rectangle
painter.drawRect(10, 10, 100, 50);

// ... (more drawing commands)
  1. Include the necessary headers (QPainter and QBrush).
  2. Create a QPainter object, typically associated with a widget you want to draw on.
  3. Define the brush you want to use:
    • Create a QColor object to specify the solid color.
    • Construct a QBrush object using the QColor.
  4. Call painter.setBrush(brush) to apply the brush to the painter.
  5. Use drawing functions like drawRect to fill shapes with the set brush.

Key Points

  • To revert to no filling (transparent interior), use a brush with style Qt::NoBrush.
  • You can change the brush multiple times within a painting process to create diverse fills.
  • setBrush() only affects subsequent drawing commands with the same QPainter object.
  • Experiment with different brush styles and properties to achieve the desired visual effects in your Qt applications.
  • For gradient, texture, or pattern brushes, explore the constructors and properties of the corresponding QGradient, QTextureBrush, and QPatternBrush classes, respectively.


Linear Gradient Brush

#include <QtGui/QPainter>
#include <QtGui/QBrush>
#include <QtGui/QGradient>

// ...

QPainter painter(&widget);

// Create a linear gradient brush
QLinearGradient gradient(0, 0, 100, 100);
gradient.setColorAt(0.0, Qt::blue);
gradient.setColorAt(1.0, Qt::yellow);
QBrush brush(gradient);
painter.setBrush(brush);

// Draw a rectangle with a blue to yellow gradient
painter.drawRect(10, 10, 100, 50);
  • Constructs a QBrush using the gradient and sets it on the painter.
  • Sets colors at specific positions within the gradient (0.0 for start, 1.0 for end).
  • Creates a QLinearGradient object specifying the start and end points for the gradient.

Radial Gradient Brush

#include <QtGui/QPainter>
#include <QtGui/QBrush>
#include <QtGui/QGradient>

// ...

QPainter painter(&widget);

// Create a radial gradient brush
QRadialGradient gradient(50, 50, 25);
gradient.setColorAt(0.0, Qt::white);
gradient.setColorAt(0.7, Qt::lightGray);
gradient.setColorAt(1.0, Qt::darkGray);
QBrush brush(gradient);
painter.setBrush(brush);

// Draw a circle with a white to dark gray radial gradient
painter.drawEllipse(25, 25, 50, 50);
  • Constructs a QBrush and sets it on the painter.
  • Sets colors at different positions within the gradient to create a radial effect.
  • Creates a QRadialGradient object specifying the center point and radius.

Texture Brush

#include <QtGui/QPainter>
#include <QtGui/QBrush>
#include <QtGui/QImage>

// ...

QPainter painter(&widget);

// Load an image for the texture
QImage texture("texture.png");

// Create a texture brush
QBrush brush(texture);
painter.setBrush(brush);

// Draw a rectangle with the texture pattern
painter.drawRect(10, 100, 100, 50);
  • Sets the texture brush on the painter.
  • Creates a QTextureBrush using the loaded image.
  • Loads an image using QImage.
#include <QtGui/QPainter>
#include <QtGui/QBrush>
#include <QtGui/QPixmap>

// ...

QPainter painter(&widget);

// Load a small image for the pattern
QPixmap pattern("pattern.png");

// Create a pattern brush
QBrush brush(pattern);
painter.setBrush(brush);

// Draw a rectangle with the repeating pattern
painter.drawRect(10, 150, 200, 50);
  • Sets the pattern brush on the painter.
  • Creates a QPatternBrush using the loaded image, which will be repeated as a tile.
  • Loads a small image using QPixmap.


  1. Using QPen with Solid Color

    • If you only need a solid color fill and don't require advanced features like gradients or textures, you can use QPen with a set width of 0. This effectively fills the shape with the pen's color.
    QPainter painter(&widget);
    
    // Set a solid color pen with width 0 for filling
    QColor red(255, 0, 0);
    QPen pen(red);
    pen.setWidth(0);
    painter.setPen(pen);
    
    // Draw a rectangle filled with red
    painter.drawRect(10, 10, 100, 50);
    

    Note
    This approach has limitations:

    • It only works with solid colors.
    • The fill respects the outline drawn by the pen (e.g., rounded corners if the pen has a cap style).
  2. Drawing Filled Shapes Directly

    • Certain QPainter drawing functions have a filled variant that takes a brush as an argument. These directly draw the shape with the specified brush.
    QPainter painter(&widget);
    
    // Set a solid color brush
    QColor red(255, 0, 0);
    QBrush brush(red);
    
    // Draw a filled rectangle with the red brush
    painter.fillRect(10, 100, 100, 50, brush);
    

    Note
    This approach limits flexibility as it's tied to specific shapes.

Choosing the Right Approach

  • Use filled shape drawing functions like fillRect for specific cases where you don't require advanced brush features.
  • Consider a solid color QPen with width 0 if you only need a simple solid fill and don't need outline effects.
  • Use QPainter::setBrush() for the most versatile control over fill behavior, including gradients, textures, and patterns.