Qt之简单绘图实现
效果图:

可以实现打开图片,在打开的图片上画图,可以保存图片,以及橡皮擦,画笔调大调粗换色功能。
代码:
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之简单绘图实现的更多相关文章
- 一个用于提取简体中文字符串中省,市和区并能够进行映射,检验和简单绘图的python模块
简介 一个用于提取简体中文字符串中省,市和区并能够进行映射,检验和简单绘图的python模块. 举个例子: ["徐汇区虹漕路461号58号楼5楼", "泉州市洛江区万安塘 ...
- Qt 最简单的多线程方法QtConcurrent::run()
Qt 最简单的多线程方法QtConcurrent::run()(转载) 最近编写了一个软件,没有考虑多线程的问题,编好以后,软件在执行计算的时候,鼠标响应有时候会延迟,但是完全能用,考虑到后续随着计算 ...
- Qt OpenGL三维绘图
简介 OpenGL是为三维绘图提供的标准应用编程接口. OpenGL处理的仅仅是三维绘图方面,而很少或是根本不提供图形用户界面编程方面的支持.OpenGL*应用程序的用户界面必须由其它工具包创建,比 ...
- Qt之QCustomPlot绘图(一)配置和第一个例子
最近一个用Qt开发的项目需要绘制坐标曲线,我在老师的指点下使用了QCustomPlot这个插件,使用方法简单,功能还算不错. 可是在网上找了很多资料和博文都只是将官方提供的例子演示一遍,没有系统全面的 ...
- qt超强精美绘图控件 - QCustomPlot一览 及 安装使用教程
1.概述 QCustomPlot 是一个超强超小巧的qt绘图类,非常漂亮,非常易用,只需要加入一个qcustomplot.h和qcustomplot.cpp文件即可使用,远比qwt方便和漂亮,可以自己 ...
- Qt中2D绘图问题总结(二)----------坐标系统
坐标系统 使用QPainter绘制时使用到逻辑坐标,然后转换成绘图设备的物理坐标. 逻辑坐标到物理坐标的映射由QPainter的worldTransform()函数.QPainter的viewport ...
- Qt中2D绘图问题总结(一)----------基本的绘制与填充
刚刚开始学习Qt不久,才开始渐渐地熟悉基础内容,学习过程中的一些知识的总结和感悟希望通过博客记录下来,与大家分享学习的同时,也是对自己坚持下去的鞭策,废话不多说了,开始第一次的小总结吧. Qt提供了强 ...
- Qt Quick 简单教程
上一篇<Qt Quick 之 Hello World 图文详解>我们已经分别在电脑和 Android 手机上运行了第一个 Qt Quick 示例—— HelloQtQuickApp ,这篇 ...
- 2019-04-15 Python之利用matplotlib和numpy的简单绘图
环境:win10家庭版, Anocada的 Spyder 一.简单使用 使用函数 plt.polt(x,y,label,color,width) 根据x,y 数组 绘制直,曲线 import nump ...
随机推荐
- tomcat 增加内存
打开tomcat目录的bin/catalina.bat文件,在开头处,增加: SET CATALINA_OPTS= -Xms2048m -Xmx4096m -XX:MaxNewSize=512m -X ...
- 【LeetCode】442. Find All Duplicates in an Array 解题报告(Python& C++)
作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 字典 原地变负 日期 题目地址:https://le ...
- 【LeetCode】79. Word Search 解题报告(Python & C++)
作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 回溯法 日期 题目地址:https://leetco ...
- 【LeetCode】700. Search in a Binary Search Tree 解题报告(Python)
作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 递归 日期 题目地址:https://leetcod ...
- 【LeetCode】554. Brick Wall 解题报告(Python)
[LeetCode]554. Brick Wall 解题报告(Python) 标签(空格分隔): LeetCode 作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fux ...
- Python Revisited Day 08 (高级程序设计技术)
目录 8.1 过程型程序设计进阶 8.1.1 使用字典进行分支 8.1.2 生成器表达式与函数 8.1.3 动态代码执行与动态导入 动态程序设计与内省函数(表) 动态代码执行 eval(), exec ...
- JUC之集合中的线程安全问题
集合线程安全问题 JDK Version:9 首先说下集合线程安全是什么:当多个线程对同一个集合进行添加和查询的时候,出现异常错误. 复现例子: package com.JUC; import jav ...
- MySQL数据库报错 > 1366 - Incorrect string value: ‘\xE6\xB1\x9F\xE6\x96\x87‘ for column ‘Teacher‘ at row 1
数据库报错这个多半是数据库在创建的时候没有选择字符编码,导致输入中文的时候出现报错. > 1366 - Incorrect string value: '\xE6\xB1\x9F\xE6\x96 ...
- 【MySQL作业】SELECT 数据查询——美和易思MySQL运算符应用习题
点击打开所使用到的数据库>>> 1.查询指定姓名的客户(如"张晓静")的地址和电话号码. select address 地址, phone 电话号码 from c ...
- mqttfx无法选择证书
mqttfx无法选择证书,无法读取证书 mqttfx也算是挺方便的,但是,有个问题困扰了我很久,就是windows下使用SSL/TLS选择证书路径时,点击后面三个点没有反应(有的同学就没有这个问题) ...