当发生以下情况时会产生绘制事件并调用paintEvent()函数:

    • 在窗口部件第一次显示时,系统会自动产生一个绘图事件,从而强制绘制这个窗口部件。
    • 当重新调整窗口部件的大小时,系统也会产生一个绘制事件。
    • 当窗口部件被其他窗口部件遮挡,然后又再次显示出来的时候,就会对那些隐藏的区域产生一个绘制事件。

    同时可以调用QWidget::update()或者QWidget::repaint()来强制产生一个绘制事件。
    二者的区别是:

    • repaint()函数会强制产生一个即时的重绘事件
    • update()函数只是在Qt下一次处理事件时才调用一次绘制事件。如果多次调用update(), Qt会把连续多次的绘制事件压缩成一个单一的绘制事件,这样可避免闪烁现象。
      1. void Widget::paintEvent(QPaintEvent *event)
      2. {
      3. // 创建画家
      4. QPainter painter(this);
      5. // 设置画笔颜色
      6. QPen penBlue(QColor(0,0,255));
      7. // 设置画笔宽度
      8. penBlue.setWidth(3);
      9. // 设置画笔风格
      10. penBlue.setStyle(Qt::DotLine);
      11. // 设置画家的笔
      12. painter.setPen(penBlue);
      13. // 画刷填充颜色
      14. QBrush brush(Qt::cyan);
      15. // 设置画刷风格
      16. brush.setStyle(Qt::Dense3Pattern);
      17. // 让画家使用画刷
      18. painter.setBrush(brush); // 会自动给封装图形上色
      19. // 画线
      20. painter.drawLine(QPoint(0,0),QPoint(100,100));
      21. // 画圆
      22. painter.drawEllipse(QPoint(100,100),50,50);
      23. // 画矩形
      24. painter.drawRect(QRect(10,10,50,50));
      25. // 画字体
      26. painter.drawText(QRect(20,200,100,50),QString("good good study, day day up"));
      27. }

    高级设置

    1. void Widget::paintEvent(QPaintEvent *event)
    2. {
    3. // 创建画家
    4. QPainter painter(this);
    5. // 高级设置
    6. //painter.drawEllipse(QPoint(100,100),50,50);
    7. //// 设置抗锯齿
    8. //painter.setRenderHint(QPainter::Antialiasing);
    9. //painter.drawEllipse(QPoint(200,100),50,50);
    10. painter.drawRect(QRect(20,20,50,50));
    11. // 移动画家
    12. painter.translate(QPoint(100,0));
    13. // 保存状态
    14. painter.save();
    15. painter.drawRect(QRect(20,20,50,50));
    16. // 移动画家
    17. painter.translate(QPoint(100,0));
    18. // 取出状态
    19. painter.restore();
    20. painter.drawRect(QRect(20,20,50,50));
    21. }

    画图片

    1. #include "widget.h"
    2. #include "ui_widget.h"
    3. #include <QPainter>
    4. Widget::Widget(QWidget *parent)
    5. : QWidget(parent)
    6. , ui(new Ui::Widget)
    7. {
    8. ui->setupUi(this);
    9. // 点击移动按钮移动图片
    10. pos = 10;
    11. connect(ui->pushButton,&QPushButton::clicked,[=](){
    12. pos += 20;
    13. update(); // 更新绘图事件
    14. });
    15. }
    16. Widget::~Widget()
    17. {
    18. delete ui;
    19. }
    20. void Widget::paintEvent(QPaintEvent *event)
    21. {
    22. // 创建画家
    23. QPainter painter(this);
    24. // 超出范围则恢复
    25. if(pos > width()) pos = 10;
    26. // 画图片
    27. painter.drawPixmap(pos,100,QPixmap(":/pic/Image/001.png"));
    28. }