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

news2024/11/17 15:34:01

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

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类型,若没有直接返回0
    if(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.coloradmin.cn/o/1676225.html

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

相关文章

微信加粉计数器

1.采用非注入式开发&#xff0c;支持无限多开 2.每个账号都有独立的分组&#xff0c;实时远程网页数据分享 3.后台功能强大&#xff0c;操作简单&#xff0c;自动去重复&#xff0c;准确计数分秒不差

ubuntu使用交叉编译链编译FFTW动态库

一、从官方下载FFTW压缩包 1. 在 /usr/local 新建目录fftw目录&#xff0c; 将压缩包放在 /usr/local/fftw 中解压。 2.打开解压后的文件 导入环境变量&#xff1a; export PATH$PATH:/home/theer/workspace/a64/cqa64_linuxqt5.8_bv3s/buildroot-2017.02.3/output/host/…

C语言的打字小游戏

目录 游戏内容 伪代码 main 函数 随机字符串 匹配逻辑 用户决定是否继续或退出游戏 完整代码 从0开始记录我的学习历程&#xff0c;我会尽我所能&#xff0c;写出最最大白话的文章&#xff0c;希望能够帮到你&#xff0c;谢谢。 提示&#xff1a;文章作者为初学者&#xf…

HTML常用标签-布局相关标签

布局标签 div标签 俗称"块",主要用于划分页面结构,做页面布局 自己独占一行的元素&#xff0c;设置宽高生效 span标签 俗称"层",主要用于划分元素范围,配合CSS做页面元素样式的修饰 不会自己独占一行的元素&#xff0c;设置宽高不生效 代码 <div style&…

数据库SQL编写规范-SQL书写规范整理(SQL语句书写规范全解-Word原件)

编写本文档的目的是保证在开发过程中产出高效、格式统一、易阅读、易维护的SQL代码。 1 编写目 2 SQL书写规范 3 SQL编写原则 软件全套精华资料包清单部分文件列表&#xff1a; 工作安排任务书&#xff0c;可行性分析报告&#xff0c;立项申请审批表&#xff0c;产品需求规格说…

如何使用AzurEnum快速枚举Microsoft Entra ID(Azure AD)

AzurEnum是一款针对Azure的安全工具&#xff0c;在该工具的帮助下&#xff0c;广大研究人员可以轻松快速地枚举Microsoft Entra ID&#xff08;Azure AD&#xff09;。 该工具基于纯Python 3开发&#xff0c;可以在Windows和Linux系统上运行&#xff0c;但考虑到性能和稳定性&a…

iOS——runtime

什么是runtime 我们都知道&#xff0c;将源代码转换为可执行的程序&#xff0c;通常要经过三个步骤&#xff1a;编译、链接、运行。 C 语言 作为一门静态类语言&#xff0c;在编译阶段就已经确定了所有变量的数据类型&#xff0c;同时也确定好了要调用的函数&#xff0c;以及函…

数据库的存储过程、函数与触发器

使用下面的场景来引入 1.创建表 CREATE DATABASE staff; USE staff; CREATE TABLE employee(id INT NOT NULL AUTO_INCREMENT,userName VARCHAR(255),birthDate DATE,idCard VARCHAR(255),loginName VARCHAR(255),PASSWORD VARCHAR(255),mobile VARCHAR(255),email VARCHAR(2…

【综述】人工智能、机器学习、深度学习

文章目录 前言 概念 算法 训练 性能 应用 参考资料 前言 见《初试人工智能》 概念 人工智能系统&#xff08;artifieial intelligence system&#xff09;&#xff0c;针对人类定义的给定目标&#xff0c;产生诸如内容、预测、推荐或决策等输出的一类工程系统。该工程系…

MPEG-4 AVC/H.264高清编码器 JR3211P

概述 JR3211P MPEG-4 AVC/H.264高清编码器是一款专业的高清音/视频编码产品。该产品支持几乎所有模拟及数字音/视频输入接口&#xff0c;包括CVBS、YPbPr、S-video、SD/HD-SDI、HDMI视频输入接口、平衡模拟音频&#xff08;XLR&#xff09;、非平衡模拟音频&#xff08;RCA&am…

Qwen-VL环境搭建推理测试

引子 这几天阿里的Qwen2.5大模型在大模型圈引起了轰动&#xff0c;号称地表最强中文大模型。前面几篇也写了QWen的微调等&#xff0c;视觉语言模型也写了一篇CogVLM&#xff0c;感兴趣的小伙伴可以移步Qwen1.5微调-CSDN博客。前面也写过一篇智谱AI的视觉大模型&#xff08;Cog…

计算礼品发放的最小分组数目 - 贪心思维

系列文章目录 文章目录 系列文章目录前言一、题目描述二、输入描述三、输出描述四、java代码五、测试用例 前言 本人最近再练习算法&#xff0c;所以会发布自己的解题思路&#xff0c;希望大家多指教 一、题目描述 又到了一年的末尾&#xff0c;项目组让小明负责为使得参加晚…

信创项目推进步骤

信创项目推进步骤 文章目录 信创项目推进步骤1. 制定信创替代计划2. 选择合适的信创产品3. 进行试点验证4. 全面部署和替换5. 加强网络安全建设6. 培训和技术支持7. 持续监督和评估 1. 制定信创替代计划 需要对现有的信息化硬件设备进行全面的梳理和评估&#xff0c;确定哪些设…

Properties配置文件和源码

先对测试类进行get方法复写得到getReqType 判断caseinfo等于get时&#xff0c;就是get请求&#xff0c;反之就不是 这里的url和param都是xxx代替&#xff0c;如果直接写内容&#xff0c;每次都会请求 三目运算优化 为什么要用配置文件 test里时url,可以将ip和端口写在配置文…

openlayer实现ImageStatic扩展支持平铺Wrapx

地图平铺&#xff08;Tiling&#xff09;是地图服务中常见的技术&#xff0c;用于将大尺寸的地图数据分割成许多小块&#xff08;瓦片&#xff09;&#xff0c;便于高效加载和展示。这种技术特别适用于网络环境&#xff0c;因为它允许浏览器只加载当前视图窗口内所需的地图瓦片…

【时隙ALOHA,CSMA(载波侦听多路访问)carrier sense mltiple access,无线局域网: CSMA/CA】

文章目录 时隙ALOHA时隙ALOHA的效率( Efficiency )纯ALOHA(非时隙)----效率低CSMA(载波侦听多路访问)carrier sense mltiple accessCSMA冲突CSMA/CD(冲突检测)边说边听&#xff08;提高了信道利用率&#xff09;以太网就是用的这个无线局域网: CSMA/CA无线局域网中的 MAC&#…

人工智能与机器学习的演进:重塑IT行业的未来

目录 前言一、人工智能与机器学习的最新发展1、算法和硬件的进步2、AI & ML的民主化 二、AI & ML在自动化中的应用1、工业与服务业自动化1.1 实践方式1.2 伪代码样例 2、软件开发与运维自动化2.1实践方式2.2伪代码样例 三、AI & ML在个性化服务中的应用1、推荐系统…

【C++】每日一题 17 电话号码的字母组合

给定一个仅包含数字 2-9 的字符串&#xff0c;返回所有它能表示的字母组合。答案可以按 任意顺序 返回。 给出数字到字母的映射如下&#xff08;与电话按键相同&#xff09;。注意 1 不对应任何字母。 可以使用回溯法来解决这个问题。首先定义一个映射关系将数字与字母对应起来…

tarjan学习

1.割点&#xff08;必须经过&#xff09;&#xff1a;当时&#xff0c;y是一个割点&#xff0c;x是y的一个子节点&#xff0c;当没有点x时&#xff0c;y无法访问其他点 2.割边&#xff08;必须经过&#xff09;&#xff1a;当时&#xff0c;y不经过这条边无法到达x&#xff0c…

算法-卡尔曼滤波之卡尔曼滤波的第二个方程:预测方程(状态外推方程)

在上一节中&#xff0c;使用了静态模型&#xff0c;我们推导出了卡尔曼滤波的状态更新方程&#xff0c;但是在实际情况下&#xff0c;系统都是动态&#xff0c;预测阶段&#xff0c;前后时刻的状态是改变的&#xff0c;此时我们引入预测方程&#xff0c;也叫状态外推方程&#…