- 2
- 0
- 约3.85千字
- 约 11页
- 2016-08-28 发布于河南
- 举报
十八、Qt 2D绘图(八)涂鸦板(2011-4-6)
十八、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*500pix = 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 QPushButton
在private中添加变量声明:
int scale;QPushButton *pushBtn;
然后再在下面写上按钮的槽函数声明:
private slots:??? void zoomIn();
2.在dialog.cpp中进行更改。
在构造函数里添加如下代码:
scale =1;?? //设置初始放大倍数为1,即不放大pushBtn = new QPushButton(this); //新建按钮对象pushBtn-setText(tr(“zoomIn”));?? //设置按钮显示文本pushBtn-move(500,450);??? //设置按钮放置位置connect(pushBtn,SIGNAL(clicked()),this,SLOT(zoomIn())); //对按钮的单击事件和其槽函数进行关联
这里我们利用代码添加了一个按钮对象,用它来实现放大操作。
再在构造函数以外进行zoomIn()函数的定义:
void Dialog::zoomIn() //按钮单击事件的槽函数{??? scale *=2;??? update();}
3.通过上一节的学习,我们应该已经知道想让画布的内容放大有两个办法,一个是直接放大画布的坐标,一个是放大窗口的坐标。
我们主要讲解放大窗口坐标。
void Dialog::paintEvent(QPaintEvent *){????? QPa
原创力文档

文档评论(0)