QT自定义控件,以绘画板为例

来句名言少壮不努力,老大送快递

---------------------------------------------------------------------------------------------------那么我们开始吧----------------------------------------------------------------------------------------------


在我们写程序的时候有一些特殊的组件可能QT自带的无法满足要求,那么我们需要自定义一个控件come con来吧。

这是我写的绘画板的头.h

[cpp] view plain copy
  1. #ifndef DRAWBOARD_H_   
  2. #define DRAWBOARD_H_   
  3. #include <QWidget>  
  4. #include <QMouseEvent>  
  5. #include <QPaintEvent>  
  6. #include <QPainter>  
  7. #include "qdebug.h"  
  8. class DrawBoard:public QWidget  
  9. {  
  10.     Q_OBJECT  
  11. public:  
  12.     DrawBoard(QWidget *parent=0);  
  13.     void setBackgrpundPath(QString path);  
  14.     ~DrawBoard();  
  15. protected:  
  16.     void mouseMoveEvent(QMouseEvent *event);  
  17.     void mousePressEvent(QMouseEvent *event);  
  18.     void paintEvent(QPaintEvent *event);   
  19.     void resizeEvent(QResizeEvent *);  
  20.     void mouseReleaseEvent(QMouseEvent *);  
  21. private:  
  22.     QPen pen;  
  23.     enum{DRAW_START=0,DRAW_ING=1,DRAW_END=2};  
  24.     struct DrawLinePath{  
  25.         int startX;  
  26.         int startY;  
  27.         int endX;  
  28.         int endY;  
  29.     };  
  30.     int DRAW_STATUS = DRAW_END;  
  31.     QList<QPainterPath>paintPathList;  
  32.     QList<DrawLinePath> drawLinePathList;  
  33.     int startX, startY,endX,endY;  
  34.     QString backgroundPath;  
  35.     QColor color;  
  36.     QImage *image;  
  37. };  
  38. #endif  

比较重要的是这几段:

[cpp] view plain copy
  1. protected:  
  2.     void mouseMoveEvent(QMouseEvent *event);  
  3.     void mousePressEvent(QMouseEvent *event);  
  4.     void paintEvent(QPaintEvent *event);   
  5.     void resizeEvent(QResizeEvent *);  
  6.     void mouseReleaseEvent(QMouseEvent *);  


第一个是重写的鼠标移动事件,第二个是重写的鼠标按压事件,第三个重写是图形绘画界面,第四个重写的界面大小变化通知界面,第五个重写的是鼠标抬起的事件

protected:是受保护的意思,重写这几个的意思是重写QWidget组件的四个虚函数


那么我们再来看看.cpp文件

[cpp] view plain copy
  1. #include "drawboard.h"  
  2.   
  3.   
  4. DrawBoard::DrawBoard(QWidget*parent) :QWidget(parent)  
  5. {  
  6.     backgroundPath = "-1";  
  7.     setAttribute(Qt::WA_StaticContents);//自动缩放  
  8.     setSizePolicy(QSizePolicy::Minimum, QSizePolicy::Maximum);  
  9.     image = new QImage(this->width(), this->height(), QImage::Format_Indexed8);  
  10.     image->fill(qRgba(0, 0, 0, 0));  
  11.     color == Qt::black;   
  12.     pen.setWidth(10);  
  13.     pen.setCapStyle(Qt::RoundCap);  
  14.     pen.setJoinStyle(Qt::RoundJoin);  
  15.     pen.setStyle(Qt::SolidLine);  
  16. }//鼠标抬起事件  
  17. void DrawBoard::mouseReleaseEvent(QMouseEvent *event){  
  18.     repaint();  
  19.     DRAW_STATUS = DRAW_END;  
  20.     update();  
  21. }//窗体大小改变事件  
  22. void DrawBoard::resizeEvent(QResizeEvent *event){  
  23.     update();  
  24. }   
  25. void DrawBoard::setBackgrpundPath(QString path){  
  26.     this->backgroundPath = path;  
  27.     image->load(path);   
  28.     update();  
  29. }//窗体绘画事件  
  30. void DrawBoard::paintEvent(QPaintEvent *event){    
  31.     //获取一个画笔对象    
  32.     QPainter painter(this);   
  33.     painter.setPen(pen);    
  34.     painter.drawImage(rect(), *image);    
  35.     switch (DRAW_STATUS){  
  36.     case DRAW_START:  
  37.         break;  
  38.     case DRAW_ING:  
  39.            
  40.     case  DRAW_END:     
  41.         for (int i = 0; i < drawLinePathList.size(); i++){  
  42.             DrawLinePath drawlinePath = drawLinePathList.at(i);  
  43.             painter.drawLine(drawlinePath.startX, drawlinePath.startY, drawlinePath.endX, drawlinePath.endY);  
  44.         }  
  45.            
  46.         break;  
  47.     }    
  48. }  
  49. void DrawBoard::mouseMoveEvent(QMouseEvent *event){  
  50.       
  51.     if (event->buttons()&Qt::LeftButton){   
  52.         endX = event->x();//得到鼠标的X坐标  
  53.         endY = event->y();//得到鼠标的Y坐标  
  54.         qDebug() << event->x() << ",y:" << event->y();  
  55.         DRAW_STATUS = DRAW_ING;  
  56.         DrawLinePath drawlinePath{ startX, startY, endX, endY };  
  57.         drawLinePathList.push_back(drawlinePath);  
  58.   
  59.         if (((endX - startX) > 1) || ((endY - startY) > 1))  
  60.         {  
  61.             repaint();  
  62.         }  
  63.         else{  
  64.             update();  
  65.         }  
  66.         startX = endX;  
  67.         startY = endY;  
  68.     }  
  69.     else if (event->buttons()&Qt::RightButton)  
  70.     {  
  71.   
  72.     }  
  73. }  
  74. void DrawBoard::mousePressEvent(QMouseEvent *event){  
  75.     DRAW_STATUS = DRAW_START;  
  76.     if (event->button() == Qt::LeftButton){   
  77.         qDebug() << event->x() << ",y:" << event->y();  
  78.         startX = event->x();//得到鼠标的X坐标  
  79.         startY = event->y();//的到鼠标的Y坐标  
  80.     }  
  81.     else if (event->button() == Qt::RightButton)  
  82.     {   
  83.   
  84.     }  
  85. }  
  86.   
  87. DrawBoard::~DrawBoard()  
  88. {  
  89. }  

感觉写的很详细了,那么来张运行图吧:

QT自定义控件,以绘画板为例

/////////////////////------------------end

这次的博客就在这里了,根据你自己的项目可以实现一些信号,和插槽等,根据项目来