• 7752阅读
  • 5回复

用鼠标绘制图形的问题[已经解决] [复制链接]

上一主题 下一主题
离线vaqeteart
 

只看楼主 正序阅读 楼主  发表于: 2009-12-08
我的代码在后面依次帖出来了,问题是:
当我用鼠标绘制图形的时候,调用repaint()会全部刷新,这样再次点击鼠标的时候会清空原有的图形,
我用repaint(e->x(),e->y(),lineWidth+1,lineWidth+1);的话可以不清除但是绘制出来的图形几乎就是虚线了,
怎样可以满足绘制的时候不会清空原有的内容呢?
(当然可以把画出的点全部保存,也就是去掉release时候的points.clear();调用,但是这不是我的意思)

在此先谢谢大家的关注!!
  1. //main.cpp
  2. /* 程序功能:
  3. * 使用鼠标在部件上面画线。
  4. * 使用多边形的方式画线这就不会虚线了,可是,松开鼠标的时候如果清空多边形数据会导致再次绘制的时候清除原来的数据。
  5. * */
  6. #include <QApplication>
  7. #include "myCallback.h"
  8. int main( int argc, char **argv )
  9. {
  10.     QApplication a( argc, argv );
  11.     MyCallback mouseEvent;
  12.     mouseEvent.show();
  13.     return a.exec();
  14. }


  1. //myCallback.h
  2. #ifndef __MYCALLBACK_H
  3. #define __MYCALLBACK_H
  4. //在这里声明不包含头文件可以使项目编译更快,头文件改动后减少重复编译
  5. //在源文件中包含,但是理论这样实际上这样报错了,所以只能在头文件中包含了。
  6. //class QMouseEvent;
  7. //class QWidget;
  8. #include <QWidget>
  9. #include <QMouseEvent>
  10. #include <QPoint>
  11. class MyCallback:public QWidget
  12. {
  13.     Q_OBJECT
  14.     public:
  15.         MyCallback(QWidget *parent = 0);
  16.     protected:
  17.         //按下(不是点击)鼠标会调用这个事件函数
  18.         void mousePressEvent(QMouseEvent *);
  19.         //释放鼠标按键调用这个事件函数
  20.         void mouseReleaseEvent(QMouseEvent *);
  21.         //双击鼠标执行这个事件函数
  22.         //void mouseDoubleClickEvent(QMouseEvent *);
  23.         //移动鼠标调用这个事件函数
  24.         void mouseMoveEvent(QMouseEvent *);
  25.         //绘制函数,只能在这里绘制,不能在mouseMoveEvent中绘制
  26.         //这里重新绘制整个窗口会把当前内容冲掉
  27.         void paintEvent( QPaintEvent * /*e*/ );
  28.     private:
  29.         int lineWidth;
  30.         QPolygon points;
  31. };
  32. #endif


  1. //myCallback.cpp
  2. //#include <QMessageBox>
  3. #include <QWidget>
  4. #include <QMouseEvent>
  5. #include <QPainter>
  6. #include <iostream>
  7. #include "myCallback.h"
  8. MyCallback::MyCallback(QWidget *parent):QWidget(parent)
  9. {
  10.     lineWidth = 3;
  11. }
  12. void MyCallback::mousePressEvent(QMouseEvent *e)
  13. {
  14.     points<<e->pos();
  15. }
  16. void MyCallback::mouseReleaseEvent(QMouseEvent *e)
  17. {
  18.     points.clear();
  19. }
  20. void MyCallback::mouseMoveEvent(QMouseEvent *e)
  21. {
  22.     if(points.size()>0)
  23.     {
  24.         points<<e->pos();
  25.         //repaint(e->x(),e->y(),lineWidth+1,lineWidth+1);
  26.         repaint();//第2笔总是会清空
  27.     }
  28. }
  29. void MyCallback::paintEvent( QPaintEvent * /*e*/ )
  30. {
  31.     QPainter painter(this);
  32.     //////用点画线(移动快了就成了虚线了)
  33.     //painter.drawPoint(endP);
  34.     
  35.     QPen pen;  // creates a default pen
  36.     pen.setStyle(Qt::SolidLine);
  37.     pen.setWidth(lineWidth);
  38.     pen.setBrush(Qt::green);
  39.     pen.setCapStyle(Qt::RoundCap);
  40.     pen.setJoinStyle(Qt::RoundJoin);
  41.     painter.setPen(pen);
  42.     //小线画线,这里快了也成了虚线了
  43.     //painter.drawLine(startP, endP);
  44.     painter.drawPolyline(points);
  45. }
[ 此帖被vaqeteart在2009-12-09 13:21重新编辑 ]
离线vaqeteart

只看该作者 5楼 发表于: 2009-12-09
谢谢,明白了,就是绘制的时候,不直接绘制到窗口上面,而是绘制到pixmap上面,刷新窗口的时候将pixmap绘制到窗口上面,这样原有的内容就不会清空了。
离线dbzhang800

只看该作者 4楼 发表于: 2009-12-08
引用第3楼vaqeteart于2009-12-08 16:12发表的  :
怎样将当前内容paint到一个pixmap上面?


QPainter ( QPaintDevice * device )

QPixmap 和 当前窗体都是 QPaintDevice,对 QPainter 的使用,没什么区别
离线vaqeteart

只看该作者 3楼 发表于: 2009-12-08
怎样将当前内容paint到一个pixmap上面?
离线vaqeteart

只看该作者 2楼 发表于: 2009-12-08
谢谢,能具体点吗
离线dbzhang800

只看该作者 1楼 发表于: 2009-12-08
引用楼主vaqeteart于2009-12-08 09:34发表的 用鼠标绘制图形的问题 :
怎样可以满足绘制的时候不会清空原有的内容呢?
(当然可以把画出的点全部保存,也就是去掉release时候的points.clear();调用,但是这不是我的意思)
.......


先paint 到一个 pixmap 上,然后将 pixmap paint到屏幕上
快速回复
限100 字节
 
上一个 下一个