来句名言:少壮不努力,老大送快递。
---------------------------------------------------------------------------------------------------那么我们开始吧----------------------------------------------------------------------------------------------
在我们写程序的时候有一些特殊的组件可能QT自带的无法满足要求,那么我们需要自定义一个控件come con来吧。
这是我写的绘画板的头.h
- #ifndef DRAWBOARD_H_
- #define DRAWBOARD_H_
- #include <QWidget>
- #include <QMouseEvent>
- #include <QPaintEvent>
- #include <QPainter>
- #include "qdebug.h"
- class DrawBoard:public QWidget
- {
- Q_OBJECT
- public:
- DrawBoard(QWidget *parent=0);
- void setBackgrpundPath(QString path);
- ~DrawBoard();
- protected:
- void mouseMoveEvent(QMouseEvent *event);
- void mousePressEvent(QMouseEvent *event);
- void paintEvent(QPaintEvent *event);
- void resizeEvent(QResizeEvent *);
- void mouseReleaseEvent(QMouseEvent *);
- private:
- QPen pen;
- enum{DRAW_START=0,DRAW_ING=1,DRAW_END=2};
- struct DrawLinePath{
- int startX;
- int startY;
- int endX;
- int endY;
- };
- int DRAW_STATUS = DRAW_END;
- QList<QPainterPath>paintPathList;
- QList<DrawLinePath> drawLinePathList;
- int startX, startY,endX,endY;
- QString backgroundPath;
- QColor color;
- QImage *image;
- };
- #endif
比较重要
的是这几段:
- protected:
- void mouseMoveEvent(QMouseEvent *event);
- void mousePressEvent(QMouseEvent *event);
- void paintEvent(QPaintEvent *event);
- void resizeEvent(QResizeEvent *);
- void mouseReleaseEvent(QMouseEvent *);
第一个是重写的
鼠标移动事件
,第二个是重写的
鼠标按压事件
,第三个重写是
图形绘画界面
,第四个重写的
界面大小
变化通知界面,第五个重写的是鼠
标抬起的
事件
protected:是受保护的意思,重写这几个的意思是重写QWidget组件的四个虚函数,
那么我们再来看看.cpp文件
- #include "drawboard.h"
-
-
- DrawBoard::DrawBoard(QWidget*parent) :QWidget(parent)
- {
- backgroundPath = "-1";
- setAttribute(Qt::WA_StaticContents);
- setSizePolicy(QSizePolicy::Minimum, QSizePolicy::Maximum);
- image = new QImage(this->width(), this->height(), QImage::Format_Indexed8);
- image->fill(qRgba(0, 0, 0, 0));
- color == Qt::black;
- pen.setWidth(10);
- pen.setCapStyle(Qt::RoundCap);
- pen.setJoinStyle(Qt::RoundJoin);
- pen.setStyle(Qt::SolidLine);
- }
- void DrawBoard::mouseReleaseEvent(QMouseEvent *event){
- repaint();
- DRAW_STATUS = DRAW_END;
- update();
- }
- void DrawBoard::resizeEvent(QResizeEvent *event){
- update();
- }
- void DrawBoard::setBackgrpundPath(QString path){
- this->backgroundPath = path;
- image->load(path);
- update();
- }
- void DrawBoard::paintEvent(QPaintEvent *event){
-
- QPainter painter(this);
- painter.setPen(pen);
- painter.drawImage(rect(), *image);
- switch (DRAW_STATUS){
- case DRAW_START:
- break;
- case DRAW_ING:
-
- case DRAW_END:
- for (int i = 0; i < drawLinePathList.size(); i++){
- DrawLinePath drawlinePath = drawLinePathList.at(i);
- painter.drawLine(drawlinePath.startX, drawlinePath.startY, drawlinePath.endX, drawlinePath.endY);
- }
-
- break;
- }
- }
- void DrawBoard::mouseMoveEvent(QMouseEvent *event){
-
- if (event->buttons()&Qt::LeftButton){
- endX = event->x();
- endY = event->y();
- qDebug() << event->x() << ",y:" << event->y();
- DRAW_STATUS = DRAW_ING;
- DrawLinePath drawlinePath{ startX, startY, endX, endY };
- drawLinePathList.push_back(drawlinePath);
-
- if (((endX - startX) > 1) || ((endY - startY) > 1))
- {
- repaint();
- }
- else{
- update();
- }
- startX = endX;
- startY = endY;
- }
- else if (event->buttons()&Qt::RightButton)
- {
-
- }
- }
- void DrawBoard::mousePressEvent(QMouseEvent *event){
- DRAW_STATUS = DRAW_START;
- if (event->button() == Qt::LeftButton){
- qDebug() << event->x() << ",y:" << event->y();
- startX = event->x();
- startY = event->y();
- }
- else if (event->button() == Qt::RightButton)
- {
-
- }
- }
-
- DrawBoard::~DrawBoard()
- {
- }
感觉写的很详细了,那么来张
运行图
吧:
/------------------end
这次的博客就在这里了,根据你自己的项目可以实现一些信号,和插槽等,根据项目来。