我的代码在后面依次帖出来了,问题是:
当我用鼠标绘制图形的时候,调用repaint()会全部刷新,这样再次点击鼠标的时候会清空原有的图形,
我用repaint(e->x(),e->y(),lineWidth+1,lineWidth+1);的话可以不清除但是绘制出来的图形几乎就是虚线了,
怎样可以满足绘制的时候不会清空原有的内容呢?
(当然可以把画出的点全部保存,也就是去掉release时候的points.clear();调用,但是这不是我的意思)在此先谢谢大家的关注!!
- //main.cpp
- /* 程序功能:
- * 使用鼠标在部件上面画线。
- * 使用多边形的方式画线这就不会虚线了,可是,松开鼠标的时候如果清空多边形数据会导致再次绘制的时候清除原来的数据。
- * */
- #include <QApplication>
- #include "myCallback.h"
- int main( int argc, char **argv )
- {
- QApplication a( argc, argv );
- MyCallback mouseEvent;
- mouseEvent.show();
- return a.exec();
- }
- //myCallback.h
- #ifndef __MYCALLBACK_H
- #define __MYCALLBACK_H
- //在这里声明不包含头文件可以使项目编译更快,头文件改动后减少重复编译
- //在源文件中包含,但是理论这样实际上这样报错了,所以只能在头文件中包含了。
- //class QMouseEvent;
- //class QWidget;
- #include <QWidget>
- #include <QMouseEvent>
- #include <QPoint>
- class MyCallback:public QWidget
- {
- Q_OBJECT
- public:
- MyCallback(QWidget *parent = 0);
- protected:
- //按下(不是点击)鼠标会调用这个事件函数
- void mousePressEvent(QMouseEvent *);
- //释放鼠标按键调用这个事件函数
- void mouseReleaseEvent(QMouseEvent *);
- //双击鼠标执行这个事件函数
- //void mouseDoubleClickEvent(QMouseEvent *);
- //移动鼠标调用这个事件函数
- void mouseMoveEvent(QMouseEvent *);
- //绘制函数,只能在这里绘制,不能在mouseMoveEvent中绘制
- //这里重新绘制整个窗口会把当前内容冲掉
- void paintEvent( QPaintEvent * /*e*/ );
- private:
- int lineWidth;
- QPolygon points;
- };
- #endif
- //myCallback.cpp
- //#include <QMessageBox>
- #include <QWidget>
- #include <QMouseEvent>
- #include <QPainter>
- #include <iostream>
- #include "myCallback.h"
- MyCallback::MyCallback(QWidget *parent):QWidget(parent)
- {
- lineWidth = 3;
- }
- void MyCallback::mousePressEvent(QMouseEvent *e)
- {
- points<<e->pos();
- }
- void MyCallback::mouseReleaseEvent(QMouseEvent *e)
- {
- points.clear();
- }
- void MyCallback::mouseMoveEvent(QMouseEvent *e)
- {
- if(points.size()>0)
- {
- points<<e->pos();
- //repaint(e->x(),e->y(),lineWidth+1,lineWidth+1);
- repaint();//第2笔总是会清空
- }
- }
- void MyCallback::paintEvent( QPaintEvent * /*e*/ )
- {
- QPainter painter(this);
- //////用点画线(移动快了就成了虚线了)
- //painter.drawPoint(endP);
-
- QPen pen; // creates a default pen
- pen.setStyle(Qt::SolidLine);
- pen.setWidth(lineWidth);
- pen.setBrush(Qt::green);
- pen.setCapStyle(Qt::RoundCap);
- pen.setJoinStyle(Qt::RoundJoin);
- painter.setPen(pen);
- //小线画线,这里快了也成了虚线了
- //painter.drawLine(startP, endP);
- painter.drawPolyline(points);
- }
[ 此帖被vaqeteart在2009-12-09 13:21重新编辑 ]