前文已经讲解了菜单栏、工具栏、任务栏的实现方法,下面我们对程序进行完善。实现功能为:为软件添加“文件”菜单,并在下拉列表上添加”新建”、 ”打开”、 ”保存”、 ”另存为”、 ”关闭”,并在工具栏加上“新建”、“打开”、“保存”图标。


代码

// 头文件
#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从零入门教程(五):图像文件操作 [新建打开保存]相关推荐

  1. sql数据库教程百度云_绘画自学零基础入门教程|五天学会绘画pdf百度云下载!...

    绘画自学零基础入门教程|五天学会绘画pdf百度云下载!画画是可以让人留存记忆的事情.我自己就很喜欢画画来记录生活中一些特别的日子.场景还有我的家人朋友们.有时候,比照片更有故事感和纪念意义-有空拿出来 ...

  2. Scrapy爬虫入门教程五 Selectors(选择器)

    Scrapy爬虫入门教程一 安装和基本使用 Scrapy爬虫入门教程二 官方提供Demo Scrapy爬虫入门教程三 命令行工具介绍和示例 Scrapy爬虫入门教程四 Spider(爬虫) Scrap ...

  3. R语言七天入门教程五:认识并使用函数

    R语言七天入门教程五:认识并使用函数 一.什么是函数 在编程语言中,如果有一段代码需要在多次重复使用,除了复制粘贴外,还可以将其写成一个函数.函数可以很方便地实现代码复用,对于复杂的程序功能,可以将其 ...

  4. linux宝塔搭建网站,宝塔Linux面板搭建网站入门教程五(宝塔Linux面板安装WordPress博客程序)...

    本文于 2021-04-01 00:04 更新,本文內容具有時效性,如有失效,請在博客站內搜相關商家名稱,即可查看到關於此商家的最新優惠活動! 國外商家建議使用"谷歌瀏覽器"訪問, ...

  5. ps怎么一下选中多个图层_ps怎么一下选中多个图层_PS入门教程:学习怎么新建图层,创意图层的相关技巧知识......

    PS入门教程:学习怎么新建图层,创意图层的相关技巧知识.下面我们就一起来学习一下吧,单击"图层"面板底部的"创建新图层"按钮或者按ps新建图层快捷键:Ctrl+ ...

  6. 【QT】QT从零入门教程(一):图像处理自编软件

    自说自话   寒假有了闲暇时间,于是决定做一个实际点的项目.在此之前,一直想做一款软件,把自己所学过的知识融汇进去,以软件界面的形式呈现出来.此前接触过OpenCV,学C++也有一段时间了,正好想从零 ...

  7. 计算机语言中的逻辑型数据,零基础易语言入门教程(五)之逻辑型数据类型

    在上篇文章给大家介绍了零基础易语言入门教程(四)之数据类型,上篇针对数值到文本类型知识,今天给大家介绍下逻辑型数据. 具体方法和步骤如下所示: 1.逻辑型数据非真即假: 首先申请一个局部变量(A)类型 ...

  8. SpringCloud 入门教程(五): Ribbon实现客户端的负载均衡

    接上节,假如我们的Hello world服务的访问量剧增,用一个服务已经无法承载, 我们可以把Hello World服务做成一个集群. 很简单,我们只需要复制Hello world服务,同时将原来的端 ...

  9. Android入门教程五之使用AndroidStudio+SDK开发安卓APP

    <!-- Android 基础入门教程 end --><div class="col middle-column big-middle-column">&l ...

最新文章

  1. ASP.NET MVC 第三章 异步提交数据
  2. HarmonyOS之常用布局DependentLayout的使用
  3. bigquery_到Google bigquery的sql查询模板,它将您的报告提升到另一个层次
  4. Go语言,在Ubuntu9.10和Windows安装
  5. Java并发编程之线程安全性分析之原子性、可见性、有序性
  6. coreboot学习1:编译并使用qemu模拟
  7. python中的作用域_python 模块的作用域
  8. 看拉扎维《模拟CMOS集成电路设计》的一些总结和思考(八)——反馈
  9. lucene索引源码分析1
  10. 《如果我不曾见过太阳》
  11. 如何选择JAVA培训机构,兼议什么样的人适合培训机构
  12. SpringBoot(一):项目概述
  13. dns异常原因有哪些?该如何修复?
  14. Oracle JDE MRP FPO目的、设置与使用
  15. spark源码分析之ShuffleExternalSorter
  16. Postman安装与卸载
  17. Vue 添加时间轴 vue-light-timeline
  18. 诈骗应用重卷AppStore
  19. dell电脑无法修复此计算机,电脑系统坏了不要紧,戴尔自带恢复工具,一键恢复原装正版系统...
  20. VC GDI+ 窗口截图内存BMP转JPG,压缩、JPG再转IStream流,IStream流再转 BYTE

热门文章

  1. c语言合法自定义标识符_c语言合法标识符的要求是什么
  2. AcWing1073.树的中心(树形DP)题解
  3. Visual Studio最常用、最高效的快捷键
  4. 【less-1】基于SQLI的SQL字符型报错注入
  5. 程序员提升工作效率和质量工具
  6. ACM基础——OJ上的Java代码提交规范
  7. Rosie's Frankly Speaking
  8. 个人工作用SQL短句,不定时更新
  9. 一文搞懂List 、ListObject、List?的区别以及? extends T与? super T的区别
  10. bzoj2733 永无乡 splay树的启发式合并