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

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

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.hqwc.cn/news/700077.html

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

相关文章

Python爬虫逆向——某公开数据网站实例小记(二)

注意&#xff01;&#xff01;&#xff01;&#xff01;某XX网站逆向实例仅作为学习案例&#xff0c;禁止其他个人以及团体做谋利用途&#xff01;&#xff01;&#xff01; 第一步&#xff1a;分析页面和请求方式 aHR0cHM6Ly95Z3AuZ2R6d2Z3Lmdvdi5jbi8jLzQ0L2p5Z2c 此网站经…

ORACLE ODA一体机存储节点电源故障的分析处理

近期&#xff0c;某用户的ORACLE ODA一体机在例行机房巡检时出现亮黄灯告警&#xff1b;用户反馈次问题后我们立刻通过远程方式&#xff0c;登陆ODA的控制台进行查看&#xff1b; 对于ODA一体机&#xff08;2个计算节点1个存储节点&#xff09;&#xff0c;计算节点可以通过il…

HTTP协议及应用

一.HTTP协议 1.HTTP协议版本 HTTP1.0&#xff1a;服务器处理完成后立即断开TCP连接&#xff08;无连接&#xff09;&#xff0c;服务器不跟踪每个客户端也不记录过去的请求&#xff08;无状态&#xff09;&#xff1b; HTTP1.1&#xff1a;KeepAlived长连接避免了连接建立和…

卷积神经网络CNN的运行过程、常见术语与问题

目录 一、CNN运行过程 1、卷积&#xff08;Convolution&#xff09; 2、激活函数&#xff08;activation function&#xff09; 3、池化&#xff08;pooling&#xff09; 3.1 池化操作 3.2 池化过程 3.3 池化后结果 4、Flatten 5、全连接层 Flatten层的操作 全连接层…

MyBatis常见报错:org.apache.ibatis.binding.BindingException

哈喽&#xff0c;大家好&#xff0c;我是木头左&#xff01; 异常现象描述 当开发者在使用MyBatis进行数据库操作时&#xff0c;可能会遇到org.apache.ibatis.binding.BindingException: Parameter appId not found这样的错误提示。这个错误通常会让程序无法正常运行&#xff…

namenode启动失败 org.apache.hadoop.hdfs.server.common.InconsistentFSStateException:

小白的Hadoop学习笔记 2024/5/14 18:26 文章目录 问题解决报错浅浅分析一下core-ste.xml 问题 namenode启动失败 读日志 安装目录下 vim /usr/local/hadoop/logs/hadoop-tangseng-namenode-hadoop102.log2024-05-14 00:22:46,262 ERROR org.apache.hadoop.hdfs.server.namen…

ov通配符证书1590

OV通配符SSL证书也可以称之为OV企业型泛域名SSL证书&#xff0c;指的是专为企事业单位准备的通配符SSL证书&#xff0c;不仅可以用一张SSL证书保护主域名以及主域名下所有的子域名&#xff0c;还可以为多个域名网站进行身份认证服务。今天就随SSL盾小编了解性价比较高的OV通配符…

端口号查询进程PID

情况1&#xff1a;由于 idea 突然闪退&#xff0c;导致正在 debug 的 Java 进程没结束掉&#xff0c;端口还在占用&#xff0c;重新 debug 不了&#xff0c;所以需要到任务管理器把进程结束掉 但问题是如果当任务管理器进程同时有多个 Java 进程在运行&#xff08;而且名字一样…

涨点神器:即插即用特征融合模块!超低参数,性能依旧SOTA

在写论文时&#xff0c;一些通用性模块可以在不同的网络结构中重复使用&#xff0c;这简化了模型设计的过程&#xff0c;帮助我们加快了实验的迭代速度。 比如在视觉任务中&#xff0c;即插即用的特征融合模块可以无缝集成到现有网络中&#xff0c;以灵活、简单的方式提升神经…

推荐5个实用的工具软件,提高效率

​ 现在&#xff0c;有很多实用的工具和软件可以帮助我们更高效地完成各种任务。以下是几个值得推荐的工具和软件&#xff0c;能够极大地提高我们的工作效率。 1.浏览器插件——SuperCopy ​ SuperCopy是一款浏览器插件&#xff0c;主要用于增强网页文本的复制功能。它解决了…

曲线救国:window 安装 docker

你好&#xff0c;我是 shengjk1&#xff0c;多年大厂经验&#xff0c;努力构建 通俗易懂的、好玩的编程语言教程。 欢迎关注&#xff01;你会有如下收益&#xff1a; 了解大厂经验拥有和大厂相匹配的技术等 希望看什么&#xff0c;评论或者私信告诉我&#xff01; 文章目录 一…

深入解析RedisJSON:在Redis中直接处理JSON数据

码到三十五 &#xff1a; 个人主页 JSON已经成为现代应用程序之间数据传输的通用格式。然而&#xff0c;传统的关系型数据库在处理JSON数据时可能会遇到性能瓶颈。为了解决这一问题&#xff0c;Redis推出了RedisJSON模块&#xff0c;它允许开发者在Redis数据库中直接存储、查询…