Qt QLinearGradient不';t使用QBrush时不能正常工作

Qt QLinearGradient不';t使用QBrush时不能正常工作,qt,drawing,lineargradientbrush,Qt,Drawing,Lineargradientbrush,我想通过图形框架类在屏幕上画一个数字。我希望“1”的填充方法类似于 (来源:) 但是我画的“1”的画笔就像下面代码中的黄色实心画笔(一个难看的粗体黄色“1”)。你能帮我看看有什么问题吗 QGraphicsSimpleTextItem digit_1 = new QGraphicsSimpleTextItem; digit_1->setText(QString::number(1)); digit_1->setPen(QPen(QColor("black"))); QLinear

我想通过图形框架类在屏幕上画一个数字。我希望“1”的填充方法类似于


(来源:)

但是我画的“1”的画笔就像下面代码中的黄色实心画笔(一个难看的粗体黄色“1”)。你能帮我看看有什么问题吗

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));

感谢advanced。

您的问题很可能来自这样一个事实:在将字体大小设置为比默认值大得多的值之前,渐变的“区域”是基于项目的边界矩形的

因此,您得到的边界矩形比实际的边界矩形小得多。因为默认的排列方法是填充,所以很可能只看到一种颜色(或者没有足够的渐变使其实际可见)

因此,在创建渐变之前,将
setFont
调用移动到顶部。您可以将
setStyle
放在画笔上,这是根据渐变自动确定的。(事实上,您可以完全放下画笔,然后在
setBrush
中使用渐变。)

通过设置渐变的方式,可以得到“对角线”渐变。如果要从上到下进行,请使用左上角和左下角点

演示

#包括
W类:公共QGraphicsView
{
Q_对象
公众:
W(QWidget*父项=0)
:QGraphicsView(父级)
{
QGraphicsSimpleTextItem*item=新的QGraphicsSimpleTextItem;
item->setText(“堆栈溢出”);
项目->设置笔(QPen(Qt::红色));
item->setFont(QFont(“courier”,60,QFont::Bold));
QLinearGradient lgrad(项->边界矩形().topLeft(),
item->boundingRect().bottomLeft());
lgrad.setColorAt(0.0,Qt::红色);
lgrad.setColorAt(1.0,Qt::黄色);
项目->挫折(lgrad);
Qgraphicscene*场景=新的Qgraphicscene;
场景->设置背景笔刷(QBrush(Qt::黑色));
场景->添加项(项目);
场景(场景);
}
};

您的问题很可能来自这样一个事实:在将字体大小设置为比默认值大得多的值之前,渐变的“面积”是基于项目的边界矩形的

因此,您得到的边界矩形比实际的边界矩形小得多。因为默认的排列方法是填充,所以很可能只看到一种颜色(或者没有足够的渐变使其实际可见)

因此,在创建渐变之前,将
setFont
调用移动到顶部。您可以将
setStyle
放在画笔上,这是根据渐变自动确定的。(事实上,您可以完全放下画笔,然后在
setBrush
中使用渐变。)

通过设置渐变的方式,可以得到“对角线”渐变。如果要从上到下进行,请使用左上角和左下角点

演示

#包括
W类:公共QGraphicsView
{
Q_对象
公众:
W(QWidget*父项=0)
:QGraphicsView(父级)
{
QGraphicsSimpleTextItem*item=新的QGraphicsSimpleTextItem;
item->setText(“堆栈溢出”);
项目->设置笔(QPen(Qt::红色));
item->setFont(QFont(“courier”,60,QFont::Bold));
QLinearGradient lgrad(项->边界矩形().topLeft(),
item->boundingRect().bottomLeft());
lgrad.setColorAt(0.0,Qt::红色);
lgrad.setColorAt(1.0,Qt::黄色);
项目->挫折(lgrad);
Qgraphicscene*场景=新的Qgraphicscene;
场景->设置背景笔刷(QBrush(Qt::黑色));
场景->添加项(项目);
场景(场景);
}
};

你不需要画笔上的
setStyle
(但我不知道它是否会痛)。没有那条线,代码会像以前一样工作。你不需要画笔上的
setStyle
(但我不知道它是否痛)。没有那条线,代码会像以前一样工作。谢谢@Mat,但有了你的代码,视图上就不会画任何东西了!我上面发布的代码生成了其中显示的图像,并且不会更改对象布局或视口中的任何内容。如果没有显示任何内容,则表示您有其他错误-如果没有看到正在使用的实际代码的相关部分,则无法判断。QGraphicsSimpleTextItem=new QGraphicsSimpleTextItem;item->setText(“堆栈溢出”);项目->设置笔(QPen(Qt::黑色));item->setFont(QFont(“courier”,60,QFont::Bold));QLinearGradient lgrad(项->边界矩形().topLeft(),项->边界矩形().bottomLeft());lgrad.setColorAt(0.0,Qt::黄色);lgrad.setColorAt(1.0,Qt::红色);项目->挫折(lgrad);Qgraphicscene*场景=新的Qgraphicscene;场景->添加项(项目);QGraphicsView视图=新的QGraphicsView;查看->设置场景(场景);查看->显示();如果我将你放在那里的东西粘贴到
main.cpp
(并重新添加注释标记中丢失的
*
),我会得到一个带有堆栈溢出的窗口,上面有一个很好的渐变。谢谢@Mat,但是你的代码不会在视图上绘制任何东西!我上面发布的代码生成了其中显示的图像,并且不会更改对象布局或视口中的任何内容。如果没有显示任何内容,则表示您有其他错误-如果没有看到正在使用的实际代码的相关部分,则无法判断。QGraphicsSimpleTextItem=new QGraphicsSimpleTextItem;item->setText(“堆栈溢出”);项目->设置笔(QPen(Qt::黑色));item->setFont(QFont(“courier”,60,QFont::Bold));QLinearGradient lgrad(项->边界矩形().topLeft(),项->边界矩形().bottomLeft());lgrad.setColorAt(0.0,Qt::黄色);lgrad.setColorAt(1.0,Qt::红色);项目->挫折(lgrad);Qgraphicscene*场景=新的Qgraphicscene;场景->添加
#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);
        }
};