Question

I want to draw 1 digit on the screen by the graphic framework classes. I want the fill approach of '1' to be something like

The desired gradient
(source: qt-project.org)

but the brush of my drawn '1' is just like a yellow SolidBrush by the below code (an ugly bold yellow '1'). Can you help me what's wrong with it?

QGraphicsSimpleTextItem digit_1 = new QGraphicsSimpleTextItem;
digit_1->setText(QString::number(1));
digit_1->setPen(QPen(QColor("black"))); 

QLinearGradient gradient(digit_1->boundingRect().topLeft(),
                          digit_1->boundingRect().bottomRight());

gradient.setColorAt(0, Qt::white);
gradient.setColorAt(1, Qt::yellow);  // yellow is for example

QBrush brush(gradient);
brush.setStyle(Qt::BrushStyle::LinearGradientPattern);

digit_1->setBrush(brush);
digit_1->setFont(QFont("courier", 35, QFont::Black));

Thanks in advanced.

Was it helpful?

Solution

Your issue most likely comes from the fact that you're basing your gradient's "area" on the bounding rect of your item before you set the font size to something much larger than the default.

The bounding rect you're getting is thus much smaller than your actual bounding rect. Since the default spread method is padding, you're seeing most likely just one color (or not enough of the gradient for it to be actually visible).

So move your setFont call to the top, before you create the gradient. You can drop the setStyle on your brush, that's determined automatically from the gradient. (In fact, you can drop that brush entirely and use the gradient in setBrush.)

With the way you set up the gradient, you'll get a "diagonal" gradient. If you want it from top to bottom, use the top left and bottom left points instead.

Demo

enter image description here

#include <QtGui>

class W: public QGraphicsView
{
    Q_OBJECT

    public:
        W(QWidget *parent = 0)
            : QGraphicsView(parent)
        {

            QGraphicsSimpleTextItem *item = new QGraphicsSimpleTextItem;
            item->setText("Stack Overflow");
            item->setPen(QPen(Qt::red));
            item->setFont(QFont("courier", 60, QFont::Bold));

            QLinearGradient lgrad(item->boundingRect().topLeft(),
                                  item->boundingRect().bottomLeft());
            lgrad.setColorAt(0.0, Qt::red);
            lgrad.setColorAt(1.0, Qt::yellow);
            item->setBrush(lgrad);

            QGraphicsScene *scene = new QGraphicsScene;
            scene->setBackgroundBrush(QBrush(Qt::black));
            scene->addItem(item);

            setScene(scene);
        }
};
Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top