做一个图片编辑器的演示,其实也相当于 QScrollArea、QPuhButton、QSlider、QMenBar、QStatusBar、QGroupBox 等控件的综合演示
主要实现功能:打开某路径图片可以在窗口中展示,如果图片大于展示区域,会自动出现滑动块,可以通过画笔和橡皮擦来修改图片,可以选择不同的画笔颜色,可以画笔大小,编辑完成后,可以保存图片,打开图片快捷键为 ctrl + o ,保存图片快捷键为: ctrl + s ;
完整代码:图片编辑器完整源码 0积分下载
1、打开QT,创建一个 mainWindow 项目,画好UI
其中,有部分控件都设置好了一些属性
2、代码演示
篇幅原因这里仅放置部分代码:
XImage 是继承了 widget 的类,主要用于处理图片
// 菜单-打开 按钮触发
void XImage::open()
{
// 选择图片
QString fileName = QFileDialog::getOpenFileName
(this,"选择图片","C:/Users/patient/Pictures/Saved Pictures","请选择图片格式( *.jpg);;请选择图片格式( *.png)");
// 判断文件名是否栈空
if(fileName.isEmpty()) return;
src.load(fileName);
// 改变大小为 图片的大小
resize(src.size());
// 将原图备份
src_bak = src.copy();
}
// 菜单-保存 按钮触发
void XImage::save()
{
// 判断备份的图片是否存在
if(src_bak.isNull()) return;
QString fileName= QFileDialog::getSaveFileName
(this,"保存图片","C:/Users/patient/Pictures/Saved Pictures","请选择图片格式( *.jpg);;请选择图片格式( *.png)");
if(fileName.isEmpty()) return;
if(!src_bak.save(fileName)) return;
}
void XImage::paintEvent(QPaintEvent * ev)
{
QPainter p(this);
// 判断图片有没有
if(src_bak.isNull()) return;
// 绘制图片
p.drawImage(0,0,src_bak);
}
void XImage::mouseMoveEvent(QMouseEvent *event)
{
// 判断图片有没有打开,避免报错
if(src_bak.isNull()) return;
// 初始化鼠标位置
if(mpos.isNull()) mpos = event->pos();
// 设置绘制基类
QPainter p(&src_bak);
// 设置抗锯齿效果
p.setRenderHint(QPainter::Antialiasing);
// 设置画笔样式
pen.setCapStyle(Qt::RoundCap); //设置圆形画笔
pen.setJoinStyle(Qt::RoundJoin); // 设置连接处为圆形
p.setPen(pen);
// 画直线,读取鼠标位置
p.drawLine(mpos,event->pos());
// 将鼠标位置记录下来
mpos = event->pos();
// 刷新窗口
update();
}
void XImage::mouseReleaseEvent(QMouseEvent *event)
{
mpos = QPoint();
}
// 写入画笔大小
void XImage::setPenSize(int size)
{
pen.setWidth(size);
}
// 设置画笔颜色,可以通过颜色选择器改变画笔
void XImage::setPenColor(QColor color)
{
pen.setBrush(color);
}
// 橡皮擦
void XImage::setEraser(int size)
{
pen.setWidth(size);
// 用原图做画笔,实现橡皮擦功能
pen.setBrush(QBrush(src));
}
3、演示效果