十八、Qt 2D 绘图(八)涂鸦板 上面一节我们深入分析了一下 Qt的坐标系统,这一节我们在前面程序的基础上稍加改动,设计一个涂鸦板程序。 简单的涂鸦板: 1.我们再在程序中添加函数。 我们在dialog.h里的public中再添加鼠标移动事件和鼠标释放事件的函数声明: void mouseMoveEvent(QMouseEvent *); void mouseReleaseEvent(QMouseEvent *); 在 private中添加变量声明: QPixmap pix; QPoint lastPoint; QPoint endPoint; 因为在函数里声明的 QPixmap类对象是临时变量,不能存储以前的值,所以为了实现保留上次的绘画结果,我们需要将其设为全局变量。 后两个 QPoint变量存储鼠标指针的两个坐标值,我们需要用这两个坐标值完成绘图。 2.在 dialog.cpp中进行修改。 在构造函数里进行变量初始化。 resize(600,500); //窗口大小设置为 600*500 pix = QPixmap(200,200); pix.fill(Qt::white); 然后进行其他几个函数的定义: void Dialog::paintEvent(QPaintEvent *) { QPainter pp(&pix); pp.drawLine(lastPoint,endPoint); //根据鼠标指针前后两个位置就行绘制直线 lastPoint = endPoint; //让前一个坐标值等于后一个坐标值,这样就能实现画出连续的线 QPainter painter(this); painter.drawPixmap(0,0,pix); } void Dialog::mousePressEvent(QMouseEvent *event) { if(event->button()==Qt::LeftButton) //鼠标左键按下 lastPoint = event->pos(); } void Dialog::mouseMoveEvent(QMouseEvent *event) { if(event->buttons()&Qt::LeftButton) //鼠标左键按下的同时移动鼠标 { endPoint = event->pos(); update(); } } void Dialog::mouseReleaseEvent(QMouseEvent *event) { if(event->button() == Qt::LeftButton) //鼠标左键释放 { endPoint = event->pos(); update(); } } 这里的update()函数,是进行界面重绘,执行该函数时就会执行那个重绘事件函数。 3.这时运行程序,效果如下。(点击图片可将其放大) 这样简单的涂鸦板程序就完成了。下面我们进行放大后的涂鸦。 放大后再进行涂鸦: 1.添加放大按钮。 在 dialog.h中添加头文件声明: #include 在 private中添加变量声明: int scale; QPushButton *pushBtn; 然后再在下面写上按钮的槽函数声明: private slots: void zoomIn(); 2.在 dialog.cpp中进行更改。...