最终的效果如下:

首先应该明白的是,鼠标作图,如果不是画直线而是任意的线,那么应该记录下每一个点的位置,然后这些点都记录下来,可以放在容器里面,之后进行画图,才能得到不规则的图形。
打开图片很简单:

void MainWindow::on_pushButton_clicked()
{QString fileName=QFileDialog::getOpenFileName(this,tr("choose image"),".",tr("Images (*.jpg *.png)"));if(fileName.isEmpty()){return;}QImage image;image.load(fileName);ui->picLabel->setPixmap(QPixmap::fromImage(image));
}

重点需要重写鼠标画图的几个函数:

    virtual void paintEvent(QPaintEvent *p) override;void mousePressEvent(QMouseEvent *e);void mouseMoveEvent(QMouseEvent *e);void mouseReleaseEvent(QMouseEvent *e);

同时还需要申明myLabel类,继承QLabel,在这个继承类中完成鼠标作图,如果你不太懂推荐你先看一下:
http://blog.csdn.net/binleebit/article/details/75949211

这个人讲得比较详细,主要告诉你了怎么在一张图片上能鼠标作图,但是他的程序只能画直线,这显然是不够的,想用鼠标随意作图并且调整粗细颜色怎么办呢?

首先在myLabel.h中定义:

#ifndef MYLABEL_H
#define MYLABEL_H
#include <QLabel>
#include <QPoint>
#include <QColor>
#include <QPaintEvent>
#include <QWidget>
#include <QImage>
#include <QPixmap>
#include <vector>#include "mainwindow.h"using namespace std;
extern QColor penColor;//声明为全局变量,便于mainwindow里面的函数进行修改
extern int penSize;typedef struct myLine{QPoint startPnt;QPoint endPnt;
}myLine;QColor rdcolor[1000][1000];//记录每个像素点的颜色
int    penthick[1000][1000];//记录笔的粗细class myLabel: public QLabel{
public:~myLabel();myLabel(QWidget* parent);//绘制线条virtual void paintEvent(QPaintEvent *p) override;void mousePressEvent(QMouseEvent *e);void mouseMoveEvent(QMouseEvent *e);void mouseReleaseEvent(QMouseEvent *e);QPoint startPnt;QPoint endPnt;bool isPressed;//QColor penColor;//声明为全局变量,便于mainwindow里面的函数进行修改//int penSize;vector<myLine*> lines;
};#endif // MYLABEL_H

在myLabel.cpp中,具体实现每个函数:

#include "mylabel.h"#include <QPainter>
#include <QPen>
#include <QMouseEvent>
#include <QDebug>QColor penColor= QColor(Qt::black);//这两个是全局变量
int penSize=2;myLabel::~myLabel(){}
myLabel::myLabel(QWidget* parent):QLabel(parent){this->setMouseTracking(true);//鼠标跟踪生效,接收鼠标移动事件this->isPressed = false;
}void myLabel::paintEvent(QPaintEvent *){//update()往往会调用这个函数QPainter painter(this);QPen pen;for(int i=0;i<lines.size();i++){myLine *pLine=lines[i];pen.setColor(rdcolor[pLine->endPnt.x()][pLine->endPnt.y()]);pen.setWidth(penthick[pLine->endPnt.x()][pLine->endPnt.y()]);painter.setPen(pen);painter.drawLine(pLine->startPnt,pLine->endPnt);qDebug()<<pLine->startPnt;}
}
void myLabel::mousePressEvent(QMouseEvent *e){setCursor(Qt::PointingHandCursor);startPnt =e->pos();endPnt =e->pos();this->isPressed =true;
}
void myLabel::mouseMoveEvent(QMouseEvent *e){if(this->isPressed){endPnt =e->pos();//新添加的像素颜色rdcolor[endPnt.x()][endPnt.y()]=penColor;//记录像素点的颜色penthick[endPnt.x()][endPnt.y()]=penSize;myLine *line =new myLine;line->startPnt =startPnt;line->endPnt =endPnt;this->lines.push_back(line);update();startPnt= endPnt;}
}
void myLabel::mouseReleaseEvent(QMouseEvent *){setCursor(Qt::ArrowCursor);this->isPressed =false;
}

上面有一些我需要解释一下:

1. 每当update()函数调用的时候,其实是调用paintEvent()函数。这个函数被调用之后从vector容器中调出来每一个line. line里面有一个坐标,通过drealine画出来这个点,我们就能够看到笔迹了。
2.rdcolor 和 penthick两个数组实际上记录的是每个像素点的颜色和粗细。mouseMoveEvent()函数每次被调用的时候,程序都会记录下来endPnt,也就是移动的下一个点的位置。那么我读出来这个点的位置之后,我就记录下来这个点的颜色penColor和这个点应该的粗细penSize。这些都是在mouseMoveEvent函数中完成的。同样,我在paintEvent()中画的时候我需要判断一下这个点的颜色和粗细然后再画,也就是

pen.setColor(rdcolor[pLine->endPnt.x()][pLine->endPnt.y()]);
pen.setWidth(penthick[pLine->endPnt.x()][pLine->endPnt.y()]);
painter.setPen(pen);
painter.drawLine(pLine->startPnt,pLine->endPnt);

这几句话做的事情。

3.那么我按了红黑和粗细按钮怎么传递到penColor ,penSize之中呢?这个就涉及到全局变量的用法,因为我的按钮使在mainwindow.cpp中,而上述这些是在myLabel.cpp当中执行的。这个可以参考我的http://blog.csdn.net/hanzhen7541/article/details/78061469 这篇文章。
       在mianwindow.cpp中对全局变量进行修改,只需要用槽函数就行了,只要包含了myLabel.h头文件,并且在myLabel.h头文件用extern声明了这两个全局变量penColor ,penSize就可以在mainwindow.cpp中直接调用和修改了:

void MainWindow::on_red_btn_clicked()
{penColor=QColor(Qt::red);
}void MainWindow::on_thin_btn_clicked()
{penSize=2;
}void MainWindow::on_wide_btn_clicked()
{penSize=5;
}void MainWindow::on_black_btn_clicked()
{penColor=QColor(Qt::black);
}

上面就是基本上所有的步骤了。实际上我的程序拓展起来就是一个画板,读者可以自行加载图片,在上面涂鸦。希望程序能够帮到一些人。

Qt中实现鼠标作图并且控制每一笔粗细和颜色的方法相关推荐

  1. 在Qt中设置鼠标光标形状的方法介绍

    本文主要介绍在 Qt 中设置鼠标光标形状的方法. 说明: 本文中的应用程序是面向 Windows 操作系统的: 本文中使用的 Qt Creator 版本号为:7.0.0: 本文中使用的 Qt 版本号为 ...

  2. Qt中利用QTime类来控制时间,这里简单介绍一下QTime的成员函数的用法:

    QTime::QTime() 默认构造函数,构造一个时,分,秒都为0的时间,如00:00:00.000(午夜) QTime::QTime(int h, int m, int s=0, int ms = ...

  3. Qt中一个.cpp类的函数调用另一个.cpp中类的函数的方法

    Qt 下面经常会用到一个函数调用的时候会调用到另一个函数,如果这两个函数在两个.cpp文件中,那么应该怎么调用呢? 假设在B类点击一个按钮会调用A类的一个函数,实际上只需要: 一. 在B的构造函数中c ...

  4. Qt 中的信息输出机制:QDebug、QInfo、QWarning、QCritical 的简单介绍和用法

    Qt 中的信息输出机制 介绍 QDebug 在 Qt 中使用 qDebug 输出不同类型的信息 浮点数:使用 %!f(MISSING) 格式化符号输出浮点数 布尔值:使用 %! (MISSING)和 ...

  5. 【QT小记】QT中如何弹起菜单

    在QT中使用鼠标右键弹起菜单,或左键长按弹出菜单的方法 窗口设置菜单策略 // 设置菜单策略为自定义菜单 this->setContextMenuPolicy(Qt::CustomContext ...

  6. Qt中的TableWidget初始化表头、行高、选中、自动扩展和接受修改

    一.需求 设置QT中的TableWidget样式,初始化表头,行高和颜色,行选中,是否修改,是否自动扩展宽度等. 二.代码 void MainWindow::TimerListInit() {QStr ...

  7. QT中QString 和 LPCWSTR 的相互转换

    在windosw 编程中,常用到LPCWSTR 变量,QT中最常用到QString,下面提供QString和LPCWSTR 相互转换的方法 1.把 LPWSTR 转换成QString LPCWSTR ...

  8. 详解在QT中写控制台程序 实例

    详解在QT中写控制台程序 实例 在QT中写控制台程序 实例是本文介绍的内容,不多说了,先来看本文内容. AD: 本文介绍的是详解在QT中写控制台程序 实例,来看那内容.找到两种方法可以写控制台程序 第 ...

  9. Qt中解除按键在聚焦时键盘空格键可以控制

    Qt中解除按键在聚焦时键盘空格键可以控制,只允许鼠标左键可以点击按键 首先需要知道原因,为什么键盘上的空格键也可以点击按键? 根据Qt官网说明:A push button emits the sign ...

最新文章

  1. Ubuntu平台 Qt 5.x 安装方法
  2. proc文件系统概述
  3. 【实战】Weblogic xmldecoder反序列化Getshell
  4. Service Mesh简史
  5. 《BI那点儿事》Microsoft 决策树算法
  6. idea git将多余的代码提交到本地,如何退回。
  7. 力扣题目系列:860. 柠檬水找零
  8. linux下把 python 程序运行的输出结果记录到 log 文件中
  9. 购物车代码(html+css)
  10. 《深入浅出MFC》下载
  11. 搭建私有云盘 cloudreve
  12. 第二十期 U-Boot添加web failsafe功能《路由器就是开发板》
  13. win7计算机所有软件无法运行程序,解决Win7应用程序无法启动的方法
  14. 彻底了解Cookie
  15. 苹果软件更新在哪里_手机资讯:iPhone 为什么比安卓手机好用iPhone 的独到之处在哪里...
  16. rabbit 的使用方法
  17. 苹果手机屏幕上的圆点如何设置呢?
  18. A3NCF: An Adaptive Aspect Attention Model for Rating Prediction
  19. how can i check the error of Journal import date source
  20. Swagger2 总结

热门文章

  1. python三本经典书籍-有哪些 Python 经典书籍?
  2. 用python画图代码-常用激活函数的python画图代码
  3. python代码翻译器-我用40行python代码写一个桌面翻译器,很nice
  4. 零基础学python书籍-非IT行业,零基础自学Python,选什么书?
  5. 免费python课程排行榜-用python爬取2017年中国最好大学排名
  6. python语言-Python Insider
  7. bag of words matlab,Bag of words(matlab实现)
  8. matlab simout,每日学习Matlab(2)
  9. java jtable 按钮_java web 怎么在jtable中添加按钮?
  10. java点击上传上传mysql并显示图片_java + mysql + jdbc实现图片上传