QPainter绘制空白或者受到其他控件颜色干扰

大家都知道:QPainter提供了高度优化的功能来完成大多数图形用户界面程序需要的绘图。它可以画任何东西,从简单的线条到复杂的形状,比如馅饼和和弦。它还可以绘制对齐的文本和像素地图。通常,它绘制一个“自然”的坐标系统,但它也可以进行视图和世界转换。QPainter可以操作任何继承QPaintDevice类的对象。

QPainter的常见用法是在小部件的paint事件中:构造和自定义(例如设置钢笔或画笔)油漆器。然后画。记住在绘制之后销毁QPainter对象。例如:

void SimpleExampleWidget::paintEvent(QPaintEvent *)
{
    QPainter painter(this);
    painter.setPen(Qt::blue);
    painter.setFont(QFont("Arial", 30));
    QRect rt(0,15,15,15);
    painter.fillRect(rt, QBrush(QColor("#ff0000")));
    painter.drawRect(rt);
}

上述例子看似没有任何问题,但是这种代码在中大型软件开发中,极容易隐藏一个超级难复现的bug;假设我这边有个类继承QGraphicsSimpleTextItem并且重载其​ paint函数 virtual void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget) override,最后在其函数实现用painter->setBrush(QColor("#00ff00"));将这两个控件分先后顺序(继承QGraphicsSimpleTextItem先放入)放入QGraphicsScene中 那么上述代码的rt矩形框还会是红色吗?,测试结果是绿色。

最安全的代码应该是这样的:

void SimpleExampleWidget::paintEvent(QPaintEvent *)
{
    QPainter painter(this);
    painter.save();
    painter.setBrush("");
    painter.setPen(Qt::blue);
    painter.setFont(QFont("Arial", 30));
    QRect rt(0,15,15,15);
    painter.fillRect(rt, QBrush(QColor("#ff0000")));
    painter.drawRect(rt);
    painter.restore();
}

首先保存QPaintDevice设备的上下文 使用当前界面的背景色作为当前画刷颜色。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值