一、新建一个Qt Gui应用,项目名称为myPalette,基类选择为QMainWindow,类名设置为MainWindow。函数
二、在mainwindow.h头文件中添加如下代码,同时添加#include<QPushButton>ui
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();
三、在mainwindow.cpp文件中添加#include<QPainter>,同时在构造函数中添加如下代码段this
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()));
四、在mainwindow.cpp文件中配置相关的事件函数,代码以下spa
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 }
五、运行结果以下code