《五》Word文件编辑软件调试及测试

news2024/9/24 17:14:22

上一期,我们已经把大致的框架给完成了,那么今天,我们就把剩下的什么复制啊,改变字体啊什么的给做一下。

那我们就一步一步的来就可以了:

新建word:

void MyWord::fileNew()
{
    qDebug()<<"hhh";
    MyChild *child=createMyChild();
    child->NewFile();
    child->show();

    enabledText();//使得 字体设置菜单可用
}

我们就是创建一个child,然后调用child.cpp中的创建就可以了,最后别忘了加上enabledText(),这样能使得字体设置菜单可用。这样我们就新建了一个word文档。

下一步打开文档:

再打开之前,要先定义一个QString,来保存要打开的文件名称,如果不为空就判断是否已经打开,已经打开过的话,就设置子窗口为活动窗口,没有打开的话,就直接加载到子窗口来。

void MyWord::fileOpen()
{
    QString filename=QFileDialog::getOpenFileName(this,tr("打开"),QString(),tr("HTML 文档(*.htm *.html);;所有文件(*.*)"));

    if(!filename.isEmpty()){
        QMdiSubWindow *existing=findMyChild(filename);
        if(existing){
//如果发现该文件已经打开,则直接设置为子窗口为活动窗口
            mdiArea->setActiveSubWindow(existing);
            return ;
        }
        MyChild  *child=createMyChild();
//如果文件没有打开则直接加载要打开的文件,并添加新的子窗口
        if(child->LoadFile(filename)){
            statusBar()->showMessage(tr("文件已经加载"),2000);
            child->show();
            enabledText();
        }else{
            child->close();
        }
    }
}

接着就是保存以及另存为:直接调用就好:

void MyWord::fileSave()
{
    if(activeMyChild()&&activeMyChild()->Save()){
        statusBar()->showMessage(tr("word文档保存成功."),2000);
    }
}
void MyWord::fileSaveAs()
{
    if(activeMyChild()&&activeMyChild()->SaveAs()){
        statusBar()->showMessage(tr("word文档另存为成功"));
    }
}

撤销,粘贴,复制等操作也是如此:

(系统里都有,那我们为何不直接使用呢?)

void MyWord::undo()
{
    if(activeMyChild()){
        activeMyChild()->undo();
    }
}

void MyWord::redo()
{
    if(activeMyChild()){
        activeMyChild()->redo();
    }
}

void MyWord::cut()
{
    if(activeMyChild()){
        activeMyChild()->cut();
    }
}

void MyWord::copy()
{
    if(activeMyChild()){
        activeMyChild()->copy();
    }
}

void MyWord::paste()
{
    if(activeMyChild()){
        activeMyChild()->paste();
    }
}void MyWord::undo()
{
    if(activeMyChild()){
        activeMyChild()->undo();
    }
}

void MyWord::redo()
{
    if(activeMyChild()){
        activeMyChild()->redo();
    }
}

void MyWord::cut()
{
    if(activeMyChild()){
        activeMyChild()->cut();
    }
}

void MyWord::copy()
{
    if(activeMyChild()){
        activeMyChild()->copy();
    }
}

void MyWord::paste()
{
    if(activeMyChild()){
        activeMyChild()->paste();
    }
}

加粗,倾斜:

要新建一个QTextFormat 用来判断是否已经加粗了,没有加粗我们直接进行加粗,有的话变为正常。在调用一下mychild中的函数格式字体。倾斜下划线同理:

void MyWord::textBold()
{
    QTextCharFormat fmt;
    fmt.setFontWeight(boldAct->isChecked()?QFont::Bold:QFont::Normal);
    if(activeMyChild()){
        activeMyChild()->MergeFormationOnWordOrSelection(fmt);
    }
}
void MyWord::textIalic()
{
    QTextCharFormat fmt;
    fmt.setFontItalic(italicAct->isChecked());

    if(activeMyChild()){
        activeMyChild()->MergeFormationOnWordOrSelection(fmt);
    }
}void MyWord::textUnderline()
{
    QTextCharFormat fmt;
    fmt.setFontUnderline(underlineAct->isChecked());

    if(activeMyChild()){
        activeMyChild()->MergeFormationOnWordOrSelection(fmt);
    }
}

对齐

设置对其,我们就是要判断是什么对齐方法,跟据你选中的来设置。

void MyWord::textAlign(QAction *a)
{
    if(activeMyChild()){
        if(a==leftAlignAct){
            activeMyChild()->SetAlign(1);
        }else if(a==centerAct){
            activeMyChild()->SetAlign(2);
        }else if(a==rightAlignAct){
            activeMyChild()->SetAlign(3);
        }else if(a==justifyAct){
            activeMyChild()->SetAlign(4);
        }
    }
}

设置段落风格:

void MyWord::textStyle(int styleIndex)
{
    if(activeMyChild()){
        activeMyChild()->SetStyle(styleIndex);
    }
}

字体选择框:

void MyWord::textFamily(const QString &f)
{
    QTextCharFormat fmt;
    fmt.setFontFamily(f);
    if(activeMyChild()){
        activeMyChild()->MergeFormationOnWordOrSelection(fmt);
    }
}

文本大小:

void MyWord::textSize(const QString &p)
{
    qreal pointsize=p.toFloat();
    if(p.toFloat()>0){
        QTextCharFormat fmt;
        fmt.setFontPointSize(pointsize);
        if(activeMyChild()){
            activeMyChild()->MergeFormationOnWordOrSelection(fmt);
        }
    }
}

效果如图:

 

void MyWord::textColor()
{
    if(activeMyChild()){
        QColor color=QColorDialog::getColor(activeMyChild()->textColor(),this);
        if(!color.isValid()){
            return ;
        }
        QTextCharFormat fmt;
//将画板设置为前台显示
        fmt.setForeground(color);
        activeMyChild()->MergeFormationOnWordOrSelection(fmt);
        colorChanged(color);
    }
}
void MyWord::fontChanged(const QFont &f)
{
    comboFont->setCurrentIndex(comboFont->findText(QFontInfo(f).family()));
    comboSize->setCurrentIndex(comboSize->findText(QString::number(f.pointSize())));

    boldAct->setChecked(f.bold());
    italicAct->setChecked(f.italic());
    underlineAct->setChecked(f.underline());
}

void MyWord::colorChanged(const QColor &c)
{
    QPixmap pix(16,16);
    pix.fill(c);
    colorAct->setIcon(pix);
}

void MyWord::alignmentChange(Qt::Alignment a)
{
    if(a & Qt::AlignLeft)
        leftAlignAct->setChecked(true);
    else if(a & Qt::AlignCenter)
        centerAct->setChecked(true);
    else if(a & Qt::AlignRight)
        rightAlignAct->setChecked(true);
    else if(a & Qt::AlignJustify)
        justifyAct->setChecked(true);
}


void MyWord::about()
{
    QMessageBox::about(this,tr("关于"),tr("此软件是基于Qt5实现的文字处理软件!!!"));

}
void MyWord::filePrintfPreview()
{
    QPrinter printer(QPrinter::HighResolution);
    QPrintPreviewDialog preview(&printer,this);
    connect(&preview,SIGNAL(paintRequested(QPinter*)),this,SLOT(printPreview(QPrinter*)));
}

void MyWord::printPrint()
{
    QPrinter printer(QPrinter::HighResolution);
    QPrintDialog *pdlg=new QPrintDialog(&printer,this);
    if(activeMyChild()->textCursor().hasSelection()){
        pdlg->addEnabledOption(QAbstractPrintDialog::PrintSelection);
    }
    pdlg->setWhatsThis(tr("打印文档"));
    if(pdlg->exec()==QDialog::Accepted){
        activeMyChild()->print(&printer);
    }
    delete pdlg;

}

这是一个Qt框架下的打印功能实现,可以实现打印预览和打印文档的功能。具体解释如下:

  • - `void MyWord::filePrintfPreview()` 函数定义了打印预览的功能。首先创建了一个 `QPrinter` 对象,然后通过 `QPrintPreviewDialog` 类来实现打印预览对话框,并且连接了 `paintRequested()` 信号到 `printPreview(QPrinter*)` 槽函数。当用户在预览对话框中点击打印按钮时,槽函数将被调用。
  • - `void MyWord::printPrint()` 函数定义了打印文档的功能。同样创建了一个 `QPrinter` 对象,然后使用 `QPrintDialog` 类来弹出打印对话框,可以选择打印全部或者只打印选中部分。当用户点击确定按钮时,将激活当前文档编辑器中的 `print()` 函数进行打印操作。

基本差不多就完工了。应该没有什么遗漏了吧。

做这个小项目主要也就是对之前学习的一个回顾与总结,这个项目也并不是多难,熟悉一下之前使用过的一些函数,整体并不是很难,之后再做什么大项目,也是有一个个小项目组合而来,慢慢写就好了。

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

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

相关文章

用wxPython和PyMuPDF将PNG图像合并为PDF文件

在日常工作中,我们经常需要将多个图像文件合并到一个PDF文档中,以便于查看、共享或存档。虽然现有的一些工具可以实现这一功能,但开发一个自定义的GUI工具可以更好地满足特定需求,并提供更好的用户体验。 在本文中,我将介绍如何使用Python、wxPython和PyMuPDF库创建一个简单的…

idea SpringBoot + Gradle 打成zip包(包含配置文件等)

前言&#xff1a; 通过上一文章&#xff0c;我们可以通过ideagradle 构建Springboot项目并实现打成jar包&#xff0c;本文章测试通过gradle 打包成zip包并包含启动文件、配置文件等信息&#xff1b;可点击此处查看idea SpringBoot Gradle 环境配置到项目打包-CSDN博客 一、工…

Char类型、转义及字符集:Java中的字符串奥秘

在Java的8中基本数据类型中&#xff0c;char类型是较难掌握&#xff0c;处理char类型本身的用法之外&#xff0c;还要理解其与字符串的关系、转义序列、字符集。 本文将从基础概念出发&#xff0c;逐步深入探讨这些主题&#xff0c;并通过实例演示来巩固理解。 一、Char类型&…

(001)apidoc 的安装

安装 1.确定 node 和 npm 的匹配版本 node -vv10.14.1# 切换node 版本 nvm list nvm use 20.12.22.安装 apidoc。 npm install -g apidoc3.生成文档&#xff1a; apidoc -i ../ -o document/ -f ".java$"-i &#xff1a;指定扫描路径。-o&#xff1a;输出目录。…

短剧私域-快速引流变现

短剧的爆火&#xff0c;衍生出了很多周边项目。 比如免费看剧App&#xff0c;短剧搜索机器人&#xff0c;短剧付费圈子等等。 这些项目的本质&#xff0c;就是借助短剧的热度&#xff0c;把流量引到自己的鱼塘进行变现。 短剧机器人大家都知道&#xff0c;目前最火的一种玩法…

Nginx+Keepalived高可用集群

NginxKeepalived高可用集群 服务器准备 服务器名IP软件包主从n1RIP 192.168.99.111 VIP 192.168.99.200nginx keepaliveMASTERn2RIP192.168.99.122 VIP 192.168.99.200nginx keepalivedh1RIP 192.168.99.133 VIP 192.168.99.200httpdh2RIP 192.168.32.144 VIP 192.168.99.200h…

2024江苏省赛 H. 完蛋,我被房产包围了 【费用流、分时图】

完蛋&#xff0c;我被房产包围了 n ≤ 200 , ∑ n ≤ 1 0 4 n \leq 200, \sum n \leq 10^4 n≤200,∑n≤104 求出最大利润 思路 每个代理商每次买房狂潮只能卖出 1 1 1 套房子&#xff0c;小红卖出一套房子贬值 1 1 1 元&#xff0c;小绿卖出一套房子贬值 ⌈ a i 10 ⌉ \…

短视频世上无人再似她:成都鼎茂宏升文化传媒公司

短视频世上无人再似她 —— 记忆中的光影传奇 在短视频盛行的今天&#xff0c;每一位创作者都在用镜头捕捉生活&#xff0c;记录世界&#xff0c;但有那么一位艺术家&#xff0c;她的作品如同夜空中最亮的星&#xff0c;即便是在信息洪流中&#xff0c;也依然闪耀着独一无二的…

数字社交的先锋:探索Facebook的未来发展

在当今数字化时代&#xff0c;社交媒体已经成为人们日常生活中不可或缺的一部分。而在众多社交平台中&#xff0c;Facebook一直处于引领地位&#xff0c;不断探索和创新&#xff0c;塑造着数字社交的未来。本文将深入探讨Facebook作为数字社交的先锋&#xff0c;探索其未来发展…

天锐绿盾和bitlocker有啥区别?

#绿盾文档加密系统# 天锐绿盾和BitLocker是两种不同的数据加密解决方案&#xff0c;它们各自有不同的重点和应用场景&#xff0c;以下是它们之间的主要区别&#xff1a; PC地址&#xff1a; https://isite.baidu.com/site/wjz012xr/2eae091d-1b97-4276-90bc-6757c5dfedee 移动…

华为hcip是什么?华为hcip网络工程师值得考吗?

前面我们讲了华为认证各个方向hcie的内容&#xff0c;那么很多同学会问&#xff0c;华为hcip是什么&#xff1f;华为hcip网络工程师值得考吗&#xff1f; 华为HCIP是什么&#xff1f; 华为HCIP&#xff08;Huawei Certified ICT Professional&#xff09;认证是华为技术有限公…

这三个网站我愿称之为制作答辩PPT的神

很多快要毕业的同学在做答辩PPT的时候总是感觉毫无思路&#xff0c;一窍不通。但这并不是你们的错&#xff0c;对于平时没接触过相关方面&#xff0c;第一次搞答辩PPT的人来说&#xff0c;这是很正常的一件事。一个好的答辩PPT可以根据以下分为以下几部分来写。 1.研究的背景和…

Leetcode—3146. 两个字符串的排列差【简单】

2024每日刷题&#xff08;135&#xff09; Leetcode—3146. 两个字符串的排列差 实现代码 class Solution { public:int findPermutationDifference(string s, string t) {int maps[26];int mapt[26];for(int i 0; i < s.size(); i) {int idxs s[i] - a;int idxt t[i] …

精酿啤酒的未来:啤酒的发展与展望

随着人们生活水平的提高和对品质生活的追求&#xff0c;精酿啤酒逐渐受到了广泛的关注和喜爱。作为精酿啤酒的代表&#xff0c;Fendi club啤酒凭借其与众不同的酿造工艺与技术&#xff0c;逐渐在市场中树立了良好的口碑。然而&#xff0c;面对未来激烈的竞争和不断变化的市场需…

摸鱼大数据——Linux搭建大数据环境(安装zooKeeper和zookeeper shell命令)五

安装zookeeper软件 1.上传软件 使用CRT等客户端远程上传 zookeeper-3.4.6.tar.gz 文件到/export/software目录下 2.解压软件 [rootnode1 ~]# cd /export/software/ [rootnode1 software]# tar -xzvf zookeeper-3.4.6.tar.gz -C /export/server/ [rootnode1 software]# cd /ex…

CentOS上Zookeeper集群安装部署

简介 Zookeeper是一款分布式的集群化软件&#xff0c;可以在多台服务器上部署&#xff0c;并协同组成分布式集群一起工作。 ZooKeeper是一个分布式的&#xff0c;开放源码的分布式应用程序协调服务&#xff0c;是Hadoop和Hbase的重要组件。它是一个为分布式应用提供一致性服务的…

若依cloud-plus(RuoYi-Cloud-Plus)框架(后端)分析

文章目录 本文以mysql为例项目结构图环境(最起码的配置)数据库初始化文件位置配置服务启动架构图框架分析&#xff1a; 本文以mysql为例 官方文档&#xff1a; https://plus-doc.dromara.org/#/ruoyi-cloud-plus/home 项目结构图 RuoYi-Cloud-Plus ├─ ruoyi-api …

霸道龙尊短视频:成都鼎茂宏升文化传媒公司

霸道龙尊短视频&#xff1a;龙族的传奇与现代的交融 在数字化时代的浪潮中&#xff0c;短视频以其短小精悍、内容丰富的特点&#xff0c;迅速占领了人们的碎片时间。成都鼎茂宏升文化传媒公司而在这些短视频中&#xff0c;一股独特的“霸道龙尊”风潮正在悄然兴起&#xff0c;…

JavaScript基础(七)

isNaN //用来判断一个变量是不是一个非数字 不是来判断是不是number类型&#xff0c;而是判断当前值能不能转为number类型&#xff0c;OK&#xff1f;懂了。 还有同学不明白&#xff0c;来看实例: <script> //isNaN(非数字)→true &#xff08;数字&#xff09;→fal…

实战| 手把手教你实现俯卧撑实时计数:OpenCV+MediaPipe

《博主简介》 小伙伴们好&#xff0c;我是阿旭。专注于人工智能、AIGC、python、计算机视觉相关分享研究。 ✌更多学习资源&#xff0c;可关注公-仲-hao:【阿旭算法与机器学习】&#xff0c;共同学习交流~ &#x1f44d;感谢小伙伴们点赞、关注&#xff01; 《------往期经典推…