窗口改变或调用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