效果图:

                                            

可以实现打开图片,在打开的图片上画图,可以保存图片,以及橡皮擦,画笔调大调粗换色功能。

代码:

XImage.h:

#ifndef __XIMAGE__H__
#define __XIMAGE__H__
#include "qwidget.h"
#include<QPaintEvent>
#include<QMouseEvent>
#include<QColor>
#include<Qpen>
class XImage :
public QWidget
{
Q_OBJECT
public:
XImage(QWidget* parent=NULL);
~XImage();
void paintEvent(QPaintEvent* ev) override;
void mouseMoveEvent(QMouseEvent* ev) override;
void mouseReleaseEvent(QMouseEvent* ev) override;
public slots:
void Open();
void SetPen(int size,QColor col);
void SetErase(int size);
void Save();
private:
QImage src;
QPoint mpos;
QPen pen;
QImage img;
};
#endif

XImage.cpp:

#include "XImage.h"
#include<QFileDialog>
#include "ui_XPS.h"
#include<QPainter>
XImage::XImage(QWidget* parent):QWidget(parent){} void XImage::Open()
{
QString filename = QFileDialog::getOpenFileName(this, QStringLiteral("打开图片"),
"",QStringLiteral("支持格式(*.png *.jpg)"));
if (filename.isNull())return;
if (!src.load(filename))return;
mpos = QPoint();
img = src.copy();
update();
} void XImage::mouseMoveEvent(QMouseEvent* ev)
{
QPainter painter(&img);
painter.setPen(pen);
if (mpos.isNull()) mpos = ev->pos();
painter.drawLine(QLine(mpos,ev->pos()));
mpos = ev->pos();
update();
} void XImage::SetPen(int size, QColor col)
{
pen.setWidth(size);
pen.setColor(col);
pen.setCapStyle(Qt::RoundCap);
pen.setJoinStyle(Qt::RoundJoin);
} void XImage::mouseReleaseEvent(QMouseEvent* ev)
{
mpos = QPoint();
} void XImage::paintEvent(QPaintEvent* ev)
{
QPainter painter(this);
painter.drawImage(0,0,img);
} void XImage::SetErase(int size)
{
pen.setWidth(size);
pen.setBrush(src);
} void XImage::Save()
{
QString filename = QFileDialog::getSaveFileName(this, QStringLiteral("打开图片"),
"", QStringLiteral("支持格式(*.png *.jpg)"));
if (filename.isNull())return;
if (!src.save(filename))return;
} XImage::~XImage(){}

XSP.h:

#ifndef __XPS__H__
#define __XPS__H__ #include <QtWidgets/QMainWindow>
#include "ui_XPS.h"
#include<QColor>
class XPS : public QMainWindow
{
Q_OBJECT public:
XPS(QWidget *parent = Q_NULLPTR);
public slots:
void SetPen();
void SetColor();
void SetErase();
void Save();
private:
Ui::XPSClass ui;
QColor col;
};
#endif

XSH.cpp:

#include "XPS.h"
#include<QColorDialog>
#include<QButtonGroup>
XPS::XPS(QWidget *parent)
: QMainWindow(parent)
{
ui.setupUi(this); connect(ui.openaction,SIGNAL(triggered()),ui.Image,SLOT(Open()));
connect(ui.saveaction,SIGNAL(triggered()),ui.Image,SLOT(Save()));
col = QColor(250,0,0);
SetPen(); QButtonGroup* group = new QButtonGroup(this);
group->addButton(ui.penButton);
group->addButton(ui.eraseButton);
group->setExclusive(true);
} void XPS::SetPen()
{
ui.Image->SetPen(ui.pensize->value(),col);
ui.penButton->setChecked(true);
} void XPS::SetColor()
{
col = QColorDialog::getColor(Qt::red, this);
QString sty = QString("background-color:rgba(%1,%2,%3,%4)")
.arg(col.red()).arg(col.green()).arg(col.blue()).arg(col.alpha());
ui.colorButton->setStyleSheet(sty);
SetPen();
} void XPS::SetErase()
{
ui.Image->SetErase(ui.pensize->value());
ui.eraseButton->setChecked(true);
} void XPS::Save()
{
ui.Image->Save();
ui.statusBar->showMessage(QStringLiteral("保存结束"), 5000);
}

main.cpp:

#include "XPS.h"
#include <QtWidgets/QApplication> int main(int argc, char *argv[])
{
QApplication a(argc, argv);
XPS w;
w.show();
return a.exec();
}

ui界面部分:

测试环境:vs2015

可能出现的问题:

要包含该目录:

Qt之简单绘图实现的更多相关文章

  1. 一个用于提取简体中文字符串中省,市和区并能够进行映射,检验和简单绘图的python模块

    简介 一个用于提取简体中文字符串中省,市和区并能够进行映射,检验和简单绘图的python模块. 举个例子: ["徐汇区虹漕路461号58号楼5楼", "泉州市洛江区万安塘 ...

  2. Qt 最简单的多线程方法QtConcurrent::run()

    Qt 最简单的多线程方法QtConcurrent::run()(转载) 最近编写了一个软件,没有考虑多线程的问题,编好以后,软件在执行计算的时候,鼠标响应有时候会延迟,但是完全能用,考虑到后续随着计算 ...

  3. Qt OpenGL三维绘图

     简介 OpenGL是为三维绘图提供的标准应用编程接口. OpenGL处理的仅仅是三维绘图方面,而很少或是根本不提供图形用户界面编程方面的支持.OpenGL*应用程序的用户界面必须由其它工具包创建,比 ...

  4. Qt之QCustomPlot绘图(一)配置和第一个例子

    最近一个用Qt开发的项目需要绘制坐标曲线,我在老师的指点下使用了QCustomPlot这个插件,使用方法简单,功能还算不错. 可是在网上找了很多资料和博文都只是将官方提供的例子演示一遍,没有系统全面的 ...

  5. qt超强精美绘图控件 - QCustomPlot一览 及 安装使用教程

    1.概述 QCustomPlot 是一个超强超小巧的qt绘图类,非常漂亮,非常易用,只需要加入一个qcustomplot.h和qcustomplot.cpp文件即可使用,远比qwt方便和漂亮,可以自己 ...

  6. Qt中2D绘图问题总结(二)----------坐标系统

    坐标系统 使用QPainter绘制时使用到逻辑坐标,然后转换成绘图设备的物理坐标. 逻辑坐标到物理坐标的映射由QPainter的worldTransform()函数.QPainter的viewport ...

  7. Qt中2D绘图问题总结(一)----------基本的绘制与填充

    刚刚开始学习Qt不久,才开始渐渐地熟悉基础内容,学习过程中的一些知识的总结和感悟希望通过博客记录下来,与大家分享学习的同时,也是对自己坚持下去的鞭策,废话不多说了,开始第一次的小总结吧. Qt提供了强 ...

  8. Qt Quick 简单教程

    上一篇<Qt Quick 之 Hello World 图文详解>我们已经分别在电脑和 Android 手机上运行了第一个 Qt Quick 示例—— HelloQtQuickApp ,这篇 ...

  9. 2019-04-15 Python之利用matplotlib和numpy的简单绘图

    环境:win10家庭版, Anocada的 Spyder 一.简单使用 使用函数 plt.polt(x,y,label,color,width) 根据x,y 数组 绘制直,曲线 import nump ...

随机推荐

  1. 如何用uniapp+vue开发自定义相机插件——拍照+录像功能

    调用手机的相机功能并实现拍照和录像是很多APP与插件都必不可少的一个功能,今天智密科技就来分享一下如何基于uniapp + vue实现自定义相机界面,并且实现: 1: 自定义拍照 2: 自定义录像 3 ...

  2. centos7使用Dockerfile(docker-compose)运行jar包

    Dockerfile文件 FROM openjdk:8-jdk-alpine MAINTAINER "镜像维护者的姓名和邮箱地址" WORKDIR app ADD demo.jar ...

  3. JAVA生成文件的md5校验值

    这里使用了lombok打印日志,也可以不用 import java.io.File; import java.io.FileInputStream; import java.io.IOExceptio ...

  4. 移动端点击a标签拨打电话、发送短信

    拨打电话 <a href="tel:88888888">888888</a> 发送短信 <a href="sms:电话号码"> ...

  5. Windows串口之解决包含setupapi.h还提示找不到符号报错

    关于 本文演示环境: win10 1909 + VS2017 1. 错误信息 明明已经添加了头文件setupapi.h 和 库 setupapi.lib, 却还是提示报错,报错信息: 1>C:\ ...

  6. 【LeetCode】871. Minimum Number of Refueling Stops 解题报告(Python)

    作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 贪心算法 日期 题目地址:https://leetc ...

  7. 【LeetCode】720. Longest Word in Dictionary 解题报告(Python)

    作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 暴力查找 排序 日期 题目地址:https://le ...

  8. 【LeetCode】847. Shortest Path Visiting All Nodes 解题报告(Python)

    作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 题目地址: https://leetcode.com/problems/shortest ...

  9. 【LeetCode】886. Possible Bipartition 解题报告(Python)

    [LeetCode]886. Possible Bipartition 解题报告(Python) 作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu ...

  10. hdu-1237简单计算器(栈的运用)

    http://acm.hdu.edu.cn/showproblem.php?pid=1237 简单的栈的运用. 首先将数字和运算符分离,分别保存在两个数组中,然后按原来的式子的顺序,首先将第一个数和第 ...