窗口改变或调用update()/repaint()函数会触发这个事件
当update()函数被调用多次,或者窗口系统发送了多个重绘事件,那么Qt就会合并这些事件成为一个事件,而这个事件拥有最大的需要重绘的区域。update()函数不会立即进行重绘,要等到Qt返回主事件循环后才会进行,所以多次调用update()函数一般只会引起一次paintEvent()函数调用
调用repaint()函数会立即调用paintEvent()函数来重绘部件,只有在必须立即进行重绘操作的情况下(比如在动画中),才使用repaint()函数
update()函数允许Qt优化速度和减少闪烁,但是repaint()函数不支持这样的优化,所以建议一般情况下尽可能使用update()函数
实例
h文件
#ifndef WIN_H #define WIN_H #include <QWidget> #include<QImage> //图片对象 #include<QPainter> //画家类 QT_BEGIN_NAMESPACE namespace Ui { class Win; } QT_END_NAMESPACE class Win : public QWidget { Q_OBJECT public: Win(QWidget *parent = nullptr); ~Win(); private slots: void on_button1_clicked(); void on_button2_clicked(); private: Ui::Win *ui; int index; //图片索引 void paintEvent(QPaintEvent*); //重写绘图事件函数,窗口改变或调用update()/repaint()函数会触发这个事件 }; #endif // WIN_H
cpp文件
#include "win.h" #include "ui_win.h" Win::Win(QWidget *parent) : QWidget(parent) , ui(new Ui::Win) { ui->setupUi(this); index=0; } Win::~Win() { delete ui; } void Win::on_button1_clicked() { if(--index<0) { index=4; } update(); //触发绘图事件 } void Win::on_button2_clicked() { if(++index>4) { index=0; } update(); } void Win::paintEvent(QPaintEvent*) { QPainter painter(this); //创建画家对象 //参数:绘图设备--在什么设备上作画 QRect rect=ui->frame1->frameRect(); QImage image("./tu/"+QString::number(index)+".jpg"); //: 表示加载资源文件 //tu1是前缀,tu是文件夹名 painter.drawImage(rect,image); }
main文件
#include "win.h" #include <QApplication> int main(int argc, char *argv[]) { QApplication a(argc, argv); Win w; w.show(); return a.exec(); }
以上工程下载地址:链接:https://pan.baidu.com/s/1uH3swAJi8IfsMmjseaexKg 提取码:6666