问题描述
在现实中,我们经常需要动态的去更新屏幕上的数字或者下标等,但是 qt 中没有直接的方法,一般都是通过先擦除,然后再绘制新的数字下标等。
在擦除模式后,我们还是需要动态绘制在之前的图片上,所以需要切换回原来的模式。这个很重要,不然无法绘制。
因为是动态增量绘制,所以需要 pixmap 为成员变量,后续的绘制都在 pixmap 上。
cpp
#include "mainwindow.h"
#include "./ui_mainwindow.h"
#include <QPainter>
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent),pixmap(1000,1000)
, ui(new Ui::MainWindow)
{
ui->setupUi(this);
oldX = 150;
oldY = 150;
count = 0;
updated = false;
}
void MainWindow::paintEvent(QPaintEvent *event){
QPainter p(this);
if(!updated){
// QPainter painter(&pixmap);
// qDebug()<<painter.compositionMode() << "helloworld";
// painter.setPen(QPen(Qt::green));
// painter.drawEllipse(QPoint(150,150),20,20);
// painter.drawText(QRect(240, 45, 270, 60), "2");
// p.drawPixmap(0,0,pixmap);
}
if (updated)
{
QPainter painter(&pixmap);
painter.setPen(QPen(Qt::green));
//painter.setCompositionMode(QPainter::CompositionMode_Xor);
int x = oldX + count;
int y = oldY + count;
int r = 20;
painter.drawEllipse(QPoint(x,y),r,r);
painter.setCompositionMode(QPainter::CompositionMode_Clear);
painter.fillRect(oldX + r -5, oldY + 100 - 5, oldX + r + 5, oldY + r + 5, Qt::white); // 清除局部区域
painter.setCompositionMode(QPainter::CompositionMode_SourceOver);
painter.drawText(QRect(x + r -5, y + 100 - 5, x + r + 5, y + r + 5), QString::number(count));
oldX = x;
oldY = y;
p.drawPixmap(0,0,pixmap);
updated = false;
}
}
MainWindow::~MainWindow()
{
delete ui;
}
void MainWindow::on_pushButton_clicked()
{
qDebug()<<"hello";
count += 20;
this->updated = true;
this->update();
}