效果图:

                                            

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

代码:

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. 查找局域网中未知设备的IP

    先运行net view,然后再运行arp -a 设备启动前后对比IP列表        

  2. django报错TypeError at /items/join(), no dict

    今天写Django模板的时候突然发现报了这个错误.stackflow了一下.改了一种dict的表达模式后成功解决. 错误: 报错写法: context = {'blogs': Blog.objects ...

  3. C++基础之虚析构函数原理

    结论 虚函数表指针 + 虚函数表 共同实现 演示 VS2017(32位) 基类有析虚构函数 一段代码演示 #include <iostream> #include <memory&g ...

  4. nanogui之更新子模块glfw3.3.2踩坑总结

    nanogui源码下载: A . https://github.com/wjakob/nanogui B . https://github.com/dalerank/nanogui B是fork的A, ...

  5. java源码——对文件内容的查找和替换(开始写界面咯)

    问题是:"键盘输入文件的路径.查找内容和替换内容,对指定路径的文件的内容进行查找和替换." 好久没写界面了,今天熟悉一下界面的书写和监听器操作. 这个问题的本身不是很难,重点应该是 ...

  6. poj 2566Bound Found(前缀和,尺取法)

    http://poj.org/problem?id=2566: Bound Found Time Limit: 5000MS   Memory Limit: 65536K Total Submissi ...

  7. git安装与使用,未完待续... ...

    ​ 目录 一.git概念 二.git简史 三.git的安装 四.git结构 五.代码托管中心-本地库和远程库的交互方式 六.初始化本地仓库 七.git常用命令 1.add和commit命令 2.sta ...

  8. 【2021/12/31】uniapp之安卓原生插件开发教程

    uniapp之安卓原生插件开发教程 准备 hbuilderX,下载 app离线SDK,下载 Andorid Studio,安卓官方或中文社区 证书(可以自己准备,也可以使用android Studio ...

  9. vue递归过滤树结构数组

    let arr=[{ title:'1', key:'1', type:0, children:[{ title:'1-1', key:'1-1', type:0, }] },{ title:'2', ...

  10. NPM镜像地址

    NPM镜像地址 npm ---- https://registry.npmjs.org/ cnpm --- http://r.cnpmjs.org/ taobao - https://registry ...