mianwindow.h
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QMainWindow>
#include <QPainter>
#include <QPaintEvent>
#include <QPixmap>
#include <QPoint>
#include <QPushButton>
class MainWindow : public QMainWindow
{
Q_OBJECT
private:
QPixmap pix;
QPoint lastPoint;
QPoint endPoint;
int scale;
QPushButton *pushBtn;
QPixmap tempPix;
bool isDrawing;
public:
MainWindow(QWidget *parent = 0);
~MainWindow();
private slots:
void zoomIn();
protected:
void paintEvent(QPaintEvent*);
void mousePressEvent(QMouseEvent* event);
void mouseMoveEvent(QMouseEvent *event);
void mouseReleaseEvent(QMouseEvent* event);
};
#endif // MAINWINDOW_H
mainwindow.cpp
#include "mainwindow.h"
#include <QRect>
#include <QPen>
#include <QPixmap>
#include <QMouseEvent>
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
{
isDrawing = false;
resize(600,500);
pix = QPixmap(400,400);
pix.fill(Qt::white);
scale = 1;
pushBtn = new QPushButton(this);
pushBtn->setText(tr("zoomIn"));
pushBtn->move(500,450);
connect(pushBtn,&QPushButton::clicked,this,&zoomIn);
}
MainWindow::~MainWindow()
{
delete pushBtn;
}
void MainWindow::paintEvent(QPaintEvent *)
{
QPainter pp(&pix);
pp.drawLine(lastPoint/scale, endPoint/scale);
lastPoint = endPoint;
QPainter painter(this);
painter.scale(scale,scale);
painter.drawPixmap(0,0,pix);
/*
* 注释掉的这一块是绘制矩形的
* 绘制矩形的代码和绘制线条的代码不能共存
* 绘制可以拖动的矩形的这种方式叫做双缓冲绘图
int x,y,h,w;
x = lastPoint.x();
y = lastPoint.y();
w = endPoint.x() - x;
h = endPoint.y() - y;
QPainter painter(this);
if(isDrawing)
{
tempPix = pix;
QPainter pp(&tempPix);
pp.drawRect(x,y,w,h);
painter.drawPixmap(0,0,tempPix);
}
else
{
QPainter pp(&pix);
pp.drawRect(x,y,w,h);
painter.drawPixmap(0,0,pix);
}
*/
}
void MainWindow::mousePressEvent(QMouseEvent *event)
{
if(event->button() == Qt::LeftButton)
{
lastPoint = event->pos();
isDrawing = true;
}
}
void MainWindow::mouseMoveEvent(QMouseEvent *event)
{
if(event->buttons() && Qt::LeftButton)
{
endPoint = event->pos();
update();
}
}
void MainWindow::mouseReleaseEvent(QMouseEvent *event)
{
if(event->button() == Qt::LeftButton)
{
endPoint = event->pos();
isDrawing = false;
update();
}
}
void MainWindow::zoomIn()
{
scale *= 2;
update();
}