【QT】QT从零入门教程(五):图像文件操作 [新建打开保存]
前文已经讲解了菜单栏、工具栏、任务栏的实现方法,下面我们对程序进行完善。实现功能为:为软件添加“文件”菜单,并在下拉列表上添加”新建”、 ”打开”、 ”保存”、 ”另存为”、 ”关闭”,并在工具栏加上“新建”、“打开”、“保存”图标。
代码
// 头文件
#pragma once
#include <QtWidgets/QMainWindow>
#include <QtGui>
#include <QtWidgets>
#include <QMainWindow>
#include "ui_mainWindow.h"class mainWindow : public QMainWindow
{Q_OBJECTpublic:mainWindow(QWidget *parent = Q_NULLPTR);~mainWindow();private:Ui::mainWindowClass ui;QDockWidget *dock_Image; // 图像窗口QString currentPath; // 当前图像的路径QLabel *imgLabel; // 图像显示框void InitImage(); // 初始化图像void Menu_File(); // 文件菜单private slots :void File_new(); // 新建void File_open(); // 打开void File_save(); // 保存void File_saveas(); // 另存为// 关闭不需要,直接使用close()
};
// CPP
#include "mainWindow.h"
#include <QtGui>
#include <QtWidgets>
#include <QMainWindow>
#pragma execution_character_set("utf-8") mainWindow::mainWindow(QWidget *parent): QMainWindow(parent)
{ui.setupUi(this);Menu_File(); // 文件菜单InitImage(); // 初始化图像QLabel
}mainWindow::~mainWindow()
{
}void mainWindow::Menu_File() // 文件菜单
{// 菜单栏QMenu *file = menuBar()->addMenu(tr("文件"));// 菜单动作QAction *Act_file_new = new QAction(QIcon("../Image/file/New.png"), tr("新建"), this);Act_file_new->setShortcuts(QKeySequence::New); // 快捷键 Ctrl+Nconnect(Act_file_new, SIGNAL(triggered()), this, SLOT(File_new()));QAction *Act_file_open = new QAction(QIcon("../Image/file/Open.png"), tr("打开"), this);Act_file_open->setShortcuts(QKeySequence::Open);// 快捷键 Ctrl+Oconnect(Act_file_open, SIGNAL(triggered()), this, SLOT(File_open()));QAction *Act_file_save = new QAction(QIcon("../Image/file/Save.png"), tr("保存"), this);Act_file_save->setShortcuts(QKeySequence::Save);// 快捷键 Ctrl+Sconnect(Act_file_save, SIGNAL(triggered()), this, SLOT(File_save()));QAction *Act_file_saveas = new QAction(QIcon("../Image/file/SaveAs.png"), tr("另存为"), this);Act_file_saveas->setShortcuts(QKeySequence::SaveAs);// 快捷键 connect(Act_file_saveas, SIGNAL(triggered()), this, SLOT(File_saveas()));QAction *Act_file_close = new QAction(QIcon("../Image/file/Close.png"), tr("关闭"), this);Act_file_close->setShortcuts(QKeySequence::Close);// 快捷键 Ctrl+F4connect(Act_file_close, SIGNAL(triggered()), this, SLOT(close()));// 将动作添加到菜单上file->addAction(Act_file_new);file->addAction(Act_file_open);file->addAction(Act_file_save);file->addAction(Act_file_saveas);file->addSeparator(); //添加分割线file->addAction(Act_file_close);// 工具栏ui.mainToolBar->addAction(Act_file_new);ui.mainToolBar->addAction(Act_file_open);ui.mainToolBar->addAction(Act_file_save);// 任务栏Act_file_new->setStatusTip(tr("新建图像"));Act_file_open->setStatusTip(tr("打开图像"));Act_file_save->setStatusTip(tr("保存图像"));Act_file_saveas->setStatusTip(tr("图像另存为"));Act_file_close->setStatusTip(tr("关闭软件"));
}void mainWindow::InitImage() // 初始化图像Label
{//……
}void mainWindow::File_new() // 新建
{//……
}void mainWindow::File_open() // 打开
{//……
}void mainWindow::File_save() // 保存
{//……
}void mainWindow::File_saveas() // 另存为
{//……
}
软件的运行结果如下:
运行无误,界面基本完成了。下面完善功能部分。
显示图像
这里运用QLabel来显示图像(头文件中定义了QLabel *imgLabel),另一个显示图像的方法是QPainter,在后面的博文中会接触到。
void mainWindow::InitImage() // 初始化图像
{// 初始化QDockWidget.在以后会讲到,是可移动隐藏的小窗口,// 可以实现PS、VS停靠窗口的效果,目前只需了解dock_Image = new QDockWidget(tr("图像"), this); // 图像setCentralWidget(dock_Image);// 初始化QLabelimgLabel = new QLabel(dock_Image);imgLabel->setScaledContents(true); // 设置QLabel自动适应图像大小// 初始图像QImage image = QImage(500, 500, QImage::Format_RGB32); // 新建图像image.fill(qRgb(255, 255, 255)); // 全白imgLabel->setPixmap(QPixmap::fromImage(image)); // 显示图像imgLabel->resize(image.width(), image.height()); // 图像与imgLabel同大小// 增加滚动条,如果图像比imgLabel大,就会出现滚动条QScrollArea* scrollArea = new QScrollArea(this);scrollArea->setBackgroundRole(QPalette::Dark);scrollArea->setAlignment(Qt::AlignCenter);scrollArea->setWidget(imgLabel);dock_Image->setWidget(scrollArea);
}
效果是这样的:
实现功能
void mainWindow::File_new() // 新建
{QImage image = QImage(500, 500, QImage::Format_RGB32); // 创建长宽各500的RGB图像image.fill(qRgb(255, 255, 255)); // 白色图像imgLabel->setPixmap(QPixmap::fromImage(image)); // 转载图像imgLabel->resize(image.width(), image.height()); // imgLabel与图像同大小currentPath = ""; // 当前路径为空
}void mainWindow::File_open() // 打开
{ QString path = QFileDialog::getOpenFileName(this, tr("选择图像"), ".", tr("Images(*.jpg *.png *.bmp)")); // 文件选择框if (!path.isEmpty()) // 检测当前路径是否正确{QImage* img = new QImage(); if (!(img->load(path))){QMessageBox::information(this, tr("错误"), tr("打开图像失败!"));delete img;return;}imgLabel->setPixmap(QPixmap::fromImage(*img));imgLabel->resize(img->width(), img->height());currentPath = path;}
}void mainWindow::File_save() // 保存
{if (currentPath.isEmpty()) // 判断是新建的图像还是打开的图像{QString path = QFileDialog::getSaveFileName(this, tr("保存图像"), ".", tr("Images(*.jpg *.png *.bmp)"));{if (!path.isEmpty())currentPath = path;}}QImage img = imgLabel->pixmap()->toImage(); // 读取图像img.save(currentPath); // 保存图像
}void mainWindow::File_saveas() // 另存为
{QString path = QFileDialog::getSaveFileName(this, tr("图像另存为"), ".", tr("Images(*.jpg *.png *.bmp)"));if (!path.isEmpty()){QImage img = imgLabel->pixmap()->toImage();img.save(path);
currentPath = path;}
}
【QT】QT从零入门教程(五):图像文件操作 [新建打开保存]相关推荐
- sql数据库教程百度云_绘画自学零基础入门教程|五天学会绘画pdf百度云下载!...
绘画自学零基础入门教程|五天学会绘画pdf百度云下载!画画是可以让人留存记忆的事情.我自己就很喜欢画画来记录生活中一些特别的日子.场景还有我的家人朋友们.有时候,比照片更有故事感和纪念意义-有空拿出来 ...
- Scrapy爬虫入门教程五 Selectors(选择器)
Scrapy爬虫入门教程一 安装和基本使用 Scrapy爬虫入门教程二 官方提供Demo Scrapy爬虫入门教程三 命令行工具介绍和示例 Scrapy爬虫入门教程四 Spider(爬虫) Scrap ...
- R语言七天入门教程五:认识并使用函数
R语言七天入门教程五:认识并使用函数 一.什么是函数 在编程语言中,如果有一段代码需要在多次重复使用,除了复制粘贴外,还可以将其写成一个函数.函数可以很方便地实现代码复用,对于复杂的程序功能,可以将其 ...
- linux宝塔搭建网站,宝塔Linux面板搭建网站入门教程五(宝塔Linux面板安装WordPress博客程序)...
本文于 2021-04-01 00:04 更新,本文內容具有時效性,如有失效,請在博客站內搜相關商家名稱,即可查看到關於此商家的最新優惠活動! 國外商家建議使用"谷歌瀏覽器"訪問, ...
- ps怎么一下选中多个图层_ps怎么一下选中多个图层_PS入门教程:学习怎么新建图层,创意图层的相关技巧知识......
PS入门教程:学习怎么新建图层,创意图层的相关技巧知识.下面我们就一起来学习一下吧,单击"图层"面板底部的"创建新图层"按钮或者按ps新建图层快捷键:Ctrl+ ...
- 【QT】QT从零入门教程(一):图像处理自编软件
自说自话 寒假有了闲暇时间,于是决定做一个实际点的项目.在此之前,一直想做一款软件,把自己所学过的知识融汇进去,以软件界面的形式呈现出来.此前接触过OpenCV,学C++也有一段时间了,正好想从零 ...
- 计算机语言中的逻辑型数据,零基础易语言入门教程(五)之逻辑型数据类型
在上篇文章给大家介绍了零基础易语言入门教程(四)之数据类型,上篇针对数值到文本类型知识,今天给大家介绍下逻辑型数据. 具体方法和步骤如下所示: 1.逻辑型数据非真即假: 首先申请一个局部变量(A)类型 ...
- SpringCloud 入门教程(五): Ribbon实现客户端的负载均衡
接上节,假如我们的Hello world服务的访问量剧增,用一个服务已经无法承载, 我们可以把Hello World服务做成一个集群. 很简单,我们只需要复制Hello world服务,同时将原来的端 ...
- Android入门教程五之使用AndroidStudio+SDK开发安卓APP
<!-- Android 基础入门教程 end --><div class="col middle-column big-middle-column">&l ...
最新文章
- ASP.NET MVC 第三章 异步提交数据
- HarmonyOS之常用布局DependentLayout的使用
- bigquery_到Google bigquery的sql查询模板,它将您的报告提升到另一个层次
- Go语言,在Ubuntu9.10和Windows安装
- Java并发编程之线程安全性分析之原子性、可见性、有序性
- coreboot学习1:编译并使用qemu模拟
- python中的作用域_python 模块的作用域
- 看拉扎维《模拟CMOS集成电路设计》的一些总结和思考(八)——反馈
- lucene索引源码分析1
- 《如果我不曾见过太阳》
- 如何选择JAVA培训机构,兼议什么样的人适合培训机构
- SpringBoot(一):项目概述
- dns异常原因有哪些?该如何修复?
- Oracle JDE MRP FPO目的、设置与使用
- spark源码分析之ShuffleExternalSorter
- Postman安装与卸载
- Vue 添加时间轴 vue-light-timeline
- 诈骗应用重卷AppStore
- dell电脑无法修复此计算机,电脑系统坏了不要紧,戴尔自带恢复工具,一键恢复原装正版系统...
- VC GDI+ 窗口截图内存BMP转JPG,压缩、JPG再转IStream流,IStream流再转 BYTE
热门文章
- c语言合法自定义标识符_c语言合法标识符的要求是什么
- AcWing1073.树的中心(树形DP)题解
- Visual Studio最常用、最高效的快捷键
- 【less-1】基于SQLI的SQL字符型报错注入
- 程序员提升工作效率和质量工具
- ACM基础——OJ上的Java代码提交规范
- Rosie's Frankly Speaking
- 个人工作用SQL短句,不定时更新
- 一文搞懂List 、ListObject、List?的区别以及? extends T与? super T的区别
- bzoj2733 永无乡 splay树的启发式合并