Qt 可以使用相同的 API 在屏幕和绘图设备上进行绘制,它主要基于QPaint、QPaintDevice和QPaintEngine 这三个类。

    • QPainter: 用来进行绘图操作的类(把它当成一个画家)
    • QPaintDevice: 抽象的二维界面,是中间媒介
    • QPaintEngine: 提供了一些接口,可用于QPainter在不同的设备上进行绘制

    QPainter 可以在继承自 QPaintDevice 类的任何对象上进行绘制操作

    QPainter 一般在控件的绘图事件 paintEvent() 中进行绘制,当窗口程序需要升级或重新绘制时,调用此成员函数。使用 repaint() 和 update()后,调用函数 paintEvent()

    QPainter的3个主要设置是: pen, brush, font

    • painter.setPen(QPen(..)): 笔

    • painter.setBrush(QBrush(..)): 填充

    • painter.setFont(QFont(..)):

    • painter.setRenderHint(QPinter::Antialiasing);
      设置了brush之后,画的是效果即填充,QPainter的属性影响绘制的图形,通常使用painter.drawXXX(..)来绘制图形

    • 设置背景为白色:

    1. setPalette(QPalette(Qt::white));
    2. setAutoFillBackground(true);
    • 画一个方块:
      需要重载函数: void paintEvent(QPaintEvent *event) Q_DECL_OVERRIDE;
    1. void Widget::paintEvent(QPaintEvent *event)
    2. {
    3. QPainter painter(this);
    4. int w = this->width();
    5. int h = this->height();
    6. QRect rect(w/4, h/4, w/2, h/2);
    7. painter.drawRect(rect);
    8. }
    • 用笔把方块的边替换掉:
    1. void Widget::paintEvent(QPaintEvent *event)
    2. {
    3. QPainter painter(this);
    4. int w = this->width();
    5. int h = this->height();
    6. QPen pen;
    7. pen.setWidth(20);
    8. pen.setColor(Qt::red);
    9. pen.setStyle(Qt::DashDotLine);
    10. pen.setJoinStyle(Qt::RoundJoin);
    11. painter.setPen(pen);
    12. QRect rect(w/4, h/4, w/2, h/2);
    13. painter.drawRect(rect);
    14. }
    • 用brush把方块内部填充上黄色:
    1. void Widget::paintEvent(QPaintEvent *event)
    2. {
    3. QPainter painter(this);
    4. int w = this->width();
    5. int h = this->height();
    6. QPen pen;
    7. pen.setWidth(20);
    8. pen.setColor(Qt::red);
    9. pen.setStyle(Qt::DashDotLine);
    10. pen.setJoinStyle(Qt::RoundJoin);
    11. painter.setPen(pen);
    12. QBrush brush;
    13. brush.setColor(Qt::yellow);
    14. brush.setStyle(Qt::Dense7Pattern);
    15. painter.setBrush(brush);
    16. QRect rect(w/4, h/4, w/2, h/2);
    17. painter.drawRect(rect);
    18. }
    • 画一个图片:
    1. void Widget::paintEvent(QPaintEvent *event)
    2. {
    3. QPainter painter(this);
    4. int w = this->width();
    5. int h = this->height();
    6. QRect rect(w/4, h/4, w/2, h/2);
    7. QImage image(":/images/images/flower.jpeg");
    8. painter.drawImage(rect, image);
    9. }
    • 画一些字,字要是红色的:
    1. void Widget::paintEvent(QPaintEvent *event)
    2. {
    3. QPainter painter(this);
    4. int w = this->width();
    5. int h = this->height();
    6. QPen pen;
    7. pen.setWidth(20);
    8. pen.setColor(Qt::red);
    9. pen.setStyle(Qt::DashDotLine);
    10. pen.setJoinStyle(Qt::RoundJoin);
    11. painter.setPen(pen);
    12. QRect rect(w/4, h/4, w/2, h/2);
    13. QFont font;
    14. font.setBold(true);
    15. font.setPointSize(20);
    16. painter.setFont(font);
    17. painter.drawText(rect, "Hello World.");
    18. }
    • 画3个点并连成一条线:
    1. QPoint points[] = {QPoint(w/3, h/3), QPoint(w/2, h/2), QPoint(w/2, 2*h/3)};
    2. painter.drawPolyline(points, 3);