1、新建一个Qt Gui应用,项目名称为myPalette,基类选择为QMainWindow,类名设置为MainWindow。

2、在mainwindow.h头文件中添加以下代码,同时添加#include<QPushButton>

 1 private:
 2     Ui::MainWindow *ui;
 3     QPixmap pix;
 4     QPoint lastPoint;
 5     QPoint endPoint;
 6     qreal scale;
 7     QPushButton *zoomInButton, *zoomOutButton;
 8 
 9 protected:
10     void paintEvent(QPaintEvent *);
11     void mousePressEvent(QMouseEvent *);
12     void mouseMoveEvent(QMouseEvent *);
13     void mouseReleaseEvent(QMouseEvent *);
14 
15 public slots:
16     void zoomIn();
17     void zoomOut();

3、在mainwindow.cpp文件中添加#include<QPainter>,同时在构造函数中添加以下代码段

 1  resize(600, 500);//窗口大小
 2     pix = QPixmap(400, 400);//画布大小
 3     pix.fill(Qt::white);
 4 
 5     scale = 1;//不放大
 6     zoomInButton = new QPushButton(this);//放大按钮
 7     zoomInButton->setText(tr("zoomIn"));
 8     zoomInButton->move(400,450);
 9     zoomOutButton = new QPushButton(this);//缩小按钮
10     zoomOutButton->setText(tr("zoomOut"));
11     zoomOutButton->move(500,450);
12 
13     connect(zoomInButton, SIGNAL(clicked()), this, SLOT(zoomIn()));
14     connect(zoomOutButton, SIGNAL(clicked()), this, SLOT(zoomOut()));

4、在mainwindow.cpp文件中配置相关的事件函数,代码如下

 1 void MainWindow::paintEvent(QPaintEvent *)
 2 {
 3     QPainter pp(&pix);
 4     pp.drawLine(lastPoint/scale, endPoint/scale);//保证画布坐标和窗口坐标相同,避免窗口坐标变化,而画布坐标未发生改变
 5     lastPoint = endPoint;
 6     QPainter painter(this);
 7     painter.scale(scale, scale);//进行放大操作,放大的是窗口坐标。如果想放大画布坐标,则执行pp.scale(scale, scale);
 8     painter.drawPixmap(0, 0, pix);//从窗口的原点(0, 0)添加该QPixmap对象,在窗口中放置画布pix。
 9                                                   //若drawPixmap(0, 0, 100, 100, pix),则指定了添加对象的尺寸大小
10 }
11 
12 void MainWindow::mousePressEvent(QMouseEvent *event)
13 {
14     if(event->button() == Qt::LeftButton)//button()函数返回的是按下的键,直接判断是否为某个键。适用于鼠标键一次按下
15     {
16         lastPoint = event->pos();
17     }
18 }
19 
20 void MainWindow::mouseMoveEvent(QMouseEvent *event)
21 {
22     if(event->buttons()&Qt::LeftButton)//buttons()函数返回的是按下的键的状态,需要通过OR运算进行判断。适用于鼠标键持续按下
23     {
24         endPoint = event->pos();
25         update();//调用update()函数会进行paintEvent()函数的重新绘制
26     }
27 }
28 
29 void MainWindow::mouseReleaseEvent(QMouseEvent *event)
30 {
31     if(event->button() == Qt::LeftButton)
32     {
33         endPoint = event->pos();
34         update();
35     }
36 }
37 
38 void MainWindow::zoomIn()
39 {
40     scale *= 2;//放大两倍
41     update();
42 }
43 
44 void MainWindow::zoomOut()
45 {
46     scale /= 2;//缩小两倍
47     update();
48 }

5、运行结果如下

 

posted on 2013-10-22 10:30  心寒若冰  阅读(972)  评论(0编辑  收藏  举报