大家都知道: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设备的上下文 使用当前界面的背景色作为当前画刷颜色。