Qt实现刮刮乐
#pragma once
#include <QWidget>
#include <QPainter>
#include <QPaintEvent>
#include <QMouseEvent>
#include <QPainterPath>
#include <QImage>
class ScratchTicket : public QWidget
{
Q_OBJECT
public:
explicit ScratchTicket(QWidget* parent = nullptr);
private:
void initWin();
void paintText(QPainter* painter);
void paintTopImage(QPainter* painter);
void paintPath(QPainter* painter);
protected:
void mouseMoveEvent(QMouseEvent* event);
void mousePressEvent(QMouseEvent* event);
void mouseReleaseEvent(QMouseEvent* event);
void paintEvent(QPaintEvent* event);
private:
bool m_bMousePress;
QPainterPath m_painterPath;
QImage* m_pImage;
};
#include "ScratchTicket.h"
ScratchTicket::ScratchTicket(QWidget* parent)
: QWidget(parent)
, m_bMousePress(false)
{
this->initWin();
}
void ScratchTicket::initWin()
{
this->setMouseTracking(true);
//绘制填满
m_painterPath.setFillRule(Qt::WindingFill);
//顶层图像
m_pImage = new QImage(this->size(), QImage::Format_ARGB32_Premultiplied);
m_pImage->fill(Qt::darkGray);
}
void ScratchTicket::mouseMoveEvent(QMouseEvent* event)
{
if (m_bMousePress) {
//鼠标按下划过,绘制圆
m_painterPath.addEllipse(event->pos(), 7, 7);
this->update();
}
QWidget::mouseMoveEvent(event);
}
void ScratchTicket::mousePressEvent(QMouseEvent* event)
{
if (event->buttons() == Qt::LeftButton)
m_bMousePress = true;
this->update();
QWidget::mousePressEvent(event);
}
void ScratchTicket::mouseReleaseEvent(QMouseEvent* event)
{
if (event->button() == Qt::LeftButton)
m_bMousePress = false;
QWidget::mousePressEvent(event);
}
void ScratchTicket::paintEvent(QPaintEvent* event)
{
QPainter painter(this);
painter.setRenderHint(QPainter::Antialiasing);
//绘制底层字体
this->paintText(&painter);
//绘制顶层图片
this->paintTopImage(&painter);
//绘制鼠标划过的部分
this->paintPath(&painter);
QWidget::paintEvent(event);
}
void ScratchTicket::paintText(QPainter* painter)
{
QPen pen;
pen.setColor(Qt::red);
QFont font;
font.setPointSize(15);
font.setBold(true);
painter->setFont(font);
painter->setPen(pen);
painter->setPen(QPen(Qt::red));
auto x = this->width() / 2 - 40;
auto y = this->height() / 2;
painter->drawText(x, y, u8"谢谢惠顾");
}
void ScratchTicket::paintTopImage(QPainter* painter)
{
painter->drawImage(0, 0, *m_pImage);
painter->end();
}
void ScratchTicket::paintPath(QPainter* painter)
{
painter->begin(m_pImage);
painter->setCompositionMode(QPainter::CompositionMode_Clear);
painter->setBrush(Qt::darkGray);
painter->drawPath(m_painterPath);
painter->end();
}