《四》系统模块整体功能关联与实现

在上一篇里,我们完成了动作的创建,那么这一次,我们把它加载到界面上,把需要是实现的动作都加上。

MyWord::MyWord(QWidget *parent): QMainWindow(parent)
{mdiArea=new QMdiArea;mdiArea->setHorizontalScrollBarPolicy(Qt::ScrollBarAsNeeded);mdiArea->setVerticalScrollBarPolicy(Qt::ScrollBarAsNeeded);setCentralWidget(mdiArea);connect(mdiArea,SIGNAL(subWindowActivated(QMdiSubWindow*)),this,SLOT(updateMenus()));windowMapper=new  QSignalMapper(this);//映射器重新发送信号,根据信号设置活动窗口connect(windowMapper,SIGNAL(mapped(QWidget*)),this,SLOT(setActiveSubWindow(QWidget*)));//创建菜单、工具栏、状态栏等相关操作(动作集合)createActions();createMenus();//调用创建菜单实现createToolBars();//调用创建工具条updateMenus();//更新菜单条目resize(800,600);setWindowTitle(tr("Office办公自动化文字编辑 软件 V2.1"));setUnifiedTitleAndToolBarOnMac(true);
}

上一次我们玩还曾了create Actions(),接下来,我们要完成createMenus(),createToolBars()等功能。

void MyWord::createMenus()
{//文件菜单fileMenu=menuBar()->addMenu(tr("文件(&F)"));fileMenu->addAction(newAct);fileMenu->addAction(openAct);fileMenu->addSeparator();//添加分隔符fileMenu->addAction(saveAct);fileMenu->addAction(saveAsAct);fileMenu->addSeparator();fileMenu->addAction(printAct);fileMenu->addAction(printPreviewAct);fileMenu->addSeparator();fileMenu->addAction(exitAct);
}

创建菜单,通过menuBar()的addMenu函数添加,再往里面添加动作,顺便还添加了分隔符addSeparator()

其他也一样添加进去就好了

//编辑菜单editMenu=menuBar()->addMenu(tr("编辑(&E)"));editMenu->addAction(undoAct);editMenu->addAction(redoAct);editMenu->addSeparator();editMenu->addAction(cutAct);editMenu->addAction(copyAct);editMenu->addAction(pasteAct);//格式菜单formatMenu=menuBar()->addMenu(tr("格式(&O)"));fontMenu=formatMenu->addMenu(tr("字体(&D)"));//字体子菜单fontMenu->addAction(boldAct);fontMenu->addAction(italicAct);fontMenu->addAction(underlineAct);alignMenu=formatMenu->addMenu(tr("段落"));alignMenu->addAction(leftAlignAct);alignMenu->addAction(centerAct);alignMenu->addAction(rightAlignAct);alignMenu->addAction(justifyAct);formatMenu->addAction(colorAct);//窗口windowMenu=menuBar()->addMenu(tr("窗口(&W)"));updateWindowMenu();connect(windowMenu,SIGNAL(aboutToShow()),this,SLOT(updateWindowMenu()));menuBar()->addSeparator();//帮助菜单helpMenu=menuBar()->addMenu(tr("帮助(&H)"));helpMenu->addAction(aboutAct);helpMenu->addSeparator();helpMenu->addAction(aboutQtAct);

 

在窗口这个动作里,我们链接函数就好了

Qmenu类下有一个信号为 aboutToShow,该信号在Qmenu展开时触发。

所以:

在连接的槽函数里我们去添加:

void MyWord::updateWindowMenu()
{
//首先清空菜单,然后再添加各个菜单动作windowMenu->clear();windowMenu->addAction(closeAct);windowMenu->addAction(closeAllAct);windowMenu->addSeparator();windowMenu->addAction(tileAct);windowMenu->addAction(cascadeAct);windowMenu->addSeparator();windowMenu->addAction(nextAct);windowMenu->addAction(previousAct);windowMenu->addSeparator();//如果有活动窗口,则显示分隔条QList<QMdiSubWindow*> windows=mdiArea->subWindowList();separatorAct->setVisible(!windows.isEmpty());//遍历各个子窗口,显示当前已打开的文档子窗口项for(int i=1;i<windows.size();i++){MyChild *child=qobject_cast<MyChild*>(windows.at(i)->widget());QString text;if(i<9){text=tr("&%1 %2").arg(i+1).arg(child->userFriendlyCurrentFile());}else{text=tr("%1 %2").arg(i+1).arg(child->userFriendlyCurrentFile());}
//添加动作作到菜单,设置动作可以选择QAction *action=windowMenu->addAction(text);action->setCheckable(true);//设置当前活动窗口动作作为选中状态action->setChecked(child==activeMyChild());
//关联动作的触发信号到信号映射器的map()槽,这个槽会发送mapped()信号connect(action,SIGNAL(triggered()),windowMapper,SLOT(map()));
//动作作与相应的窗口部件进行映射,在发送mapped()信号时就会以这个窗口部件为参数windowMapper->setMapping(action,windows.at(i));}enabledText();//使得字体设置菜单可用
}

接下来就是要创建工具条了:

跟创建菜单行为其实差不多,就是函数名字稍微变了一下:

void MyWord::createToolBars()
{//文件fileToolBar=addToolBar(tr("文件"));fileToolBar->addAction(newAct);fileToolBar->addAction(openAct);fileToolBar->addSeparator();fileToolBar->addAction(saveAct);fileToolBar->addAction(printAct);//编辑editToolBar=addToolBar(tr("文件"));editToolBar->addAction(undoAct);editToolBar->addAction(redoAct);editToolBar->addSeparator();editToolBar->addAction(cutAct);editToolBar->addAction(copyAct);editToolBar->addAction(pasteAct);//格式formatToolBar=addToolBar(tr("格式"));formatToolBar->addAction(boldAct);formatToolBar->addAction(italicAct);formatToolBar->addAction(underlineAct);formatToolBar->addSeparator();formatToolBar->addAction(leftAlignAct);formatToolBar->addAction(rightAlignAct);formatToolBar->addAction(justifyAct);formatToolBar->addSeparator();formatToolBar->addAction(colorAct);//组合addToolBarBreak(Qt::TopToolBarArea);//comboToolBar=addToolBar(tr("组合选择"));comboStyle=new QComboBox();comboToolBar->addWidget(comboStyle);comboStyle->addItem("标准");comboStyle->addItem("项目符号(●)");comboStyle->addItem("项目符号(○)");comboStyle->addItem("项目符号(□)");comboStyle->addItem("编号(1.2.3.)");comboStyle->addItem("编号(a.b.c.)");comboStyle->addItem("编号(A.B.C.)");comboStyle->addItem("编号(ⅰ.ⅱ.ⅲ.)");comboStyle->addItem("编号(Ⅰ.Ⅱ.Ⅲ.)");comboStyle->setStatusTip("段落加上标号或者编号");connect(comboStyle,SIGNAL(activated(int)),this,SLOT(textStyle(int)));comboFont=new QFontComboBox();comboToolBar->addWidget(comboFont);comboFont->setStatusTip("更改字体");connect(comboFont,SIGNAL(activated(QString)),this,SLOT(textFamily(QString)));comboSize=new QComboBox();comboToolBar->addWidget(comboSize);comboSize->setEditable(true);comboSize->setStatusTip("更改字体");QFontDatabase db;foreach(int size,db.standardSizes()){comboSize->addItem(QString::number(size));}
}

 把他们连接到对应槽函数,我们一步一步去实现就好了,

Qt foreach是一种用于遍历容器类型的语法结构。与传统的for循环相比,foreach更加易读、易写、易错,由此减少代码出错的概率。Qt foreach在Qt 4.0中被引入,可以用于遍历数组、QList、QVector、QSet、QMap和QHash等容器类型。

foreach (声明变量, 容器) {……          
}

 接着我们把细节一点一点去完善:

//判断是否有活动子窗口用activeMyChild()函数
MyChild *MyWord::activeMyChild()
{
//若有活动窗口,则将其内的中心部件转换为MyChild类型,若没有直接返回0if(QMdiSubWindow *activeSubWindows=mdiArea->activeSubWindow()){return  qobject_cast<MyChild*>(activeSubWindows->widget());}return 0;
}
//发现子窗口操作
QMdiSubWindow *MyWord::findMyChild(const QString &filename)
{/*canonicalFilePath ()可以除去路径中符号链接,如“.”和“..”等符号。这个*函数只是将加载文件的路径首先保存到canonicalFilePath中,然后再进行一些状态的设置*/QString canonicalFilePath=QFileInfo(filename).canonicalFilePath();
//遍历整个多文档区域的所有子窗口foreach (QMdiSubWindow *window, mdiArea->subWindowList()) {MyChild *myChild=qobject_cast<MyChild*>(window->widget());if(myChild->currentFile()==canonicalFilePath){return window;}}return 0;
}
void MyWord::setActiveSubWindow(QWidget *window)
{if(!window){return;}mdiArea->setActiveSubWindow(qobject_cast<QMdiSubWindow*>(window));
}
MyChild *MyWord::createMyChild()
{MyChild *child = new MyChild;mdiArea->addSubWindow(child);connect(child,SIGNAL(copyAvailable(bool)),cutAct,SLOT(setEnabled(bool)));connect(child,SIGNAL(copyAvailable(bool)),copyAct,SLOT(setEnabled(bool)));return  child;
}

还有其他一些动作的函数没有实现,下一期就写出来!!!

感谢阅读!!!!!!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/12338.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【Cesium解读】Cesium中primitive/entity贴地

官方案例 Cesium Sandcastle Cesium Sandcastle 好文推荐&#xff1a;Cesium贴地设置_primitive贴地-CSDN博客 scene.globe.depthTestAgainstTerrain true; True if primitives such as billboards, polylines, labels, etc. should be depth-tested against the terrain…

Android Q - 音频通路调试

对于当前模块不是很清楚&#xff0c;刚好有个项目这方面有点问题&#xff0c;根据展锐支持文档一步步检查就可以了。首先得先弄清楚硬件具体是怎么连接的&#xff0c;比如文档提到的案例&#xff1a;sprd codec speaker output 连接外部 PA。 耳机接的是什么&#xff0c;speake…

C/C++关键字:extern

文章目录 一、extern&#xff1a;声明外部变量或外部函数1.extern的作用2.代码举例①例1②例2③例3 一、extern&#xff1a;声明外部变量或外部函数 1.extern的作用 extern的作用&#xff1a;声明外部的全局变量或外部的函数&#xff0c;以实现跨文件使用其他.c/.h文件的全局…

C语言中数组与指针的区别

一. 简介 本文学习了 C语言中数组与指针的区别。这样的话&#xff0c;可以在编写C代码时规避掉出错的问题。 二. C语言中数组与指针的区别 1. 数组 定义字符串数组时&#xff0c;必须让编译器知道需要多少空间。 一种方法是用足够空间的数组存储字符串。例如如下&#xf…

DOM重点核心(注册事件+DOM事件流)

目录 1.注册事件 注册时间概述 addEventListener() 删除事件 2.DOM事件流 DOM事件流理论 事件对象 事件对象的常见属性和方法 e.targe 和 this的区别 阻止默认行为 阻止冒泡 事件委托 禁止右键菜单和禁止选中文字 获得鼠标的坐标&#xff08;可视区、页面、浏览器…

【教程】Linux/Jetson 安装X11VNC同步屏幕内容

转载请注明出处&#xff1a;小锋学长生活大爆炸[xfxuezhagn.cn] 如果本文帮助到了你&#xff0c;请不吝给个[点赞、收藏、关注]哦~ 目录 背景说明 实际效果 安装步骤 安装 x11vnc 配置 x11vnc 配置 x11vnc 作为系统服务 使用 VNC 客户端连接 背景说明 通常vnc-server是单…

分享一个非常好用的安装包下载网站

当我们需要下载linux下的某些包,以便在自己的环境下进行编译自己的安装包的时候,可能需要用到一些各种版本的依赖包,从网上 百度会很麻烦。 这里分享一个很好用的安装包下载网站,记得点赞收藏 网站: Red Hat Enterprise Linux Repositories - pkgs.org 找到对应系统,然…

深入理解K8S【安全认证机制kubectlconfig】

深入理解K8S【安全认证机制】 1 核心概念 1.1 安全体系 对于大型系统来说&#xff0c;对业务的权限、网络的安全认证是必不可少的。 对于linux系统来说&#xff0c;用户和组、文件权限、SELinux、防火墙、pam、sudo等&#xff0c;究其核心的目的都是为了保证系统是安全的。 …

四天学会JS高阶(学好vue的关键)——作用域解构箭头函数(理论+实战)(第一天)

一、作用域 提到作用域&#xff08;作用域又分为局部作用域和全局作用域&#xff09;&#xff0c;就要想到变量。因为作用域规定了变量能够被访问的范围&#xff08;也就是作用域是为变量而服务的&#xff09;&#xff0c;为了避免全局变量污染这一情况&#xff0c;所以需要使…

如何排查域名网站无法访问了页面报500错误

本周有一个客户&#xff0c;购买Hostease的虚拟主机&#xff0c;询问我们的在线客服&#xff0c;域名网站无法访问了报500错误页面&#xff0c;怎么办&#xff1f;我们为用户提供相关教程&#xff0c;用户很快解决了遇到的问题。在此&#xff0c;我们分享这个操作教程&#xff…

bugfix:遇见“隐形字符”:ⅰ与i的编码迷局

前言 在软件开发的世界里&#xff0c;遇到各种奇奇怪怪的bug是在所难免的。今天&#xff0c;我就遭遇了一个看似简单实则棘手的问题——用户反馈账号无法登录&#xff0c;系统一直提示“账号不存在”。一番抽丝剥茧后&#xff0c;我发现问题竟然出在一个不起眼的字符上&#x…

Go微服务: Gin框架搭建网关, 接入熔断器,链路追踪以及服务端接入限流和链路追踪

概述 本文使用最简单和快速的方式基于Gin框架搭建一个微服务的网关调用微服务的场景网关作为客户端基于RPC调用某一服务端的服务并接入熔断和限流以及链路追踪具体场景&#xff1a;通过网关API查询购物车里的数据在最后&#xff0c;会贴上网关和购物车服务的代码仓库 服务端搭…

避雷:搭建AI知识库注意事项

AI知识库作为信息存储和进行智能处理的核心部分&#xff0c;受到越来越多企业的重视。为了更好地发展&#xff0c;企业也纷纷开始搭建AI知识库。然而&#xff0c;在搭建AI知识库的过程中&#xff0c;也有很多雷区容易踩到&#xff0c;导致项目延迟、效果不佳甚至失败。所以&…

《控制系统实验与综合设计》计控第三次(含程序和题目)

实验七 采样控制系统的分析 一、实验完成任务 1、熟悉用 LF398 组成的采样控制系统&#xff1b; 2、通过本实验理解采样定理和零阶保持器的原理及其实现方法&#xff1b; 3、观察系统在阶跃作用下的稳态误差。 4.、研究开环增益 K 和采样周期 T 的变化对系统动态性能的影响…

Linux基础之进程-进程状态

目录 一、进程状态 1.1 什么是进程状态 1.2 运行状态 1.2 阻塞状态 1.3 挂起状态 二、Linux操作系统上具体的进程状态 2.1 状态 2.2 R 和 S 状态的查看 2.3 后台进程和前台进程 2.4 休眠状态和深度休眠状态 一、进程状态 1.1 什么是进程状态 首先我们知道我们的操作系…

分布式光伏监控系统功能模块详解

目前&#xff0c;分布式光伏发电系统的总容量比较小&#xff0c;并且光伏电站的功率受外界环境影响容易出现大起大落的现象。这使电压调整变得很困难。光伏电站运行维护人员不足&#xff0c;长时间不保养维护会影响光伏电站的发电效率。针对上述问题&#xff0c;鹧鸪云基于无线…

天锐绿盾|设计院图纸透明加密软件、制造业文件资料防止外泄

#图纸加密软件# 天锐绿盾是一家专注于数据安全解决方案的提供商&#xff0c;其产品主要为企业级用户设计&#xff0c;旨在保护敏感信息和知识产权免遭未经授权的访问或泄露。"天锐绿盾"的图纸透明加密软件和机械制造业文件资料防止外泄系统&#xff0c;是专为设计院…

JS中的宏任务和微任务

JavaScript 引擎是建立在一个事件循环系统之上的&#xff0c;它实时监控事件队列&#xff0c;如果有事件就执行&#xff0c;如果没有事件就等待。事件系统是一个典型的生产消费模式&#xff0c;生产者发出事件&#xff0c;接收者监听事件&#xff0c;在UI 开发中是常见的一个设…

Modbus TCP转CAN网关在不同行业中的应用以及其使用上的优势

倍讯科技Modbus TCP转CAN网关通常被用于工业自动化领域&#xff0c;特别是在需要连接现有Modbus TCP网络和CAN总线设备的场景中。以下是该网关在不同行业中的应用以及其使用上的优势&#xff1a; 1. 制造业&#xff1a; - 在制造业中&#xff0c;各种类型的设备和机器通常使用不…

Java项目实现报文数据校验注解方式(必输项、值大小)

普通项目 导入校验依赖 <dependency><groupId>org.hibernate</groupId><artifactId>hibernate-validator</artifactId><version>4.1.0.Final</version></dependency><dependency><groupId>javax.validation</…