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

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

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

新建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()` 函数进行打印操作。

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

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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

在不同的应用系统创建Python虚拟环境

在不同的应用系统创建Python虚拟环境 在Linux上创建Python虚拟环境 一、在Ubuntu上创建Python虚拟环境 可以通过使用virtualenv工具来完成。下面是创建Python虚拟环境的步骤&#xff1a; 首先确保已经安装了python3-venv包&#xff08;如果没有安装&#xff0c;则需要运行命…

产品经理如何进行项目管理?

产品经理如何进行项目管理&#xff1f; 项目管理和产品管理在本质上还是有一定差别的。产品更关注的是产品、功能、方向和反馈&#xff0c;而项目则更关注进度、质量和测试等。如果团队没有项目经理&#xff0c;那么产品经理就需要兼顾对开发人员、项目进度等进行管理。 此时…

声纹识别在无人机探测上的应用

无人机在民用和军事领域的应用越来越广泛。然而&#xff0c;随着无人机数量的增加&#xff0c;"黑飞"现象也日益严重&#xff0c;对公共安全和隐私构成了威胁。因此&#xff0c;开发有效的无人机探测与识别技术变得尤为重要。及时发现黑飞无人机的存在进而对其型号进…

软考-下午题-试题一

1、概念 2、答题技巧和规范 问题1、2&#xff1a;直接看 格式&#xff1a; 问题3&#xff1a; 格式&#xff1a; 3、例题 eg2&#xff1a;可以以后写完问题4之后&#xff0c;把问题3补充完整 问题4&#xff1a; 问题4 官方解释&#xff1a; 问题4&#xff08;3‘&#xff09; 2…

AI智能对话绘画二合一系统源码 在线生成绘画 带完整的源代码包以及搭建教程

系统概述 AI智能对话绘画二合一系统源码是一款集成了自然语言处理、深度学习、计算机视觉等多种技术的智能系统。该系统通过强大的自然语言处理能力&#xff0c;能够与用户进行流畅的AI对话&#xff0c;无论是创作构思、风格选择还是技巧咨询&#xff0c;系统都能给出精准的建…

7集成学习评分卡

集成学习评分卡 学习目标 知道LightGBM基本原理掌握使用lightGBM进行特征筛选的方法1 Gradient Boosting算法回顾 Gradient Boosting 基本原理 训练一个模型m1,产生错误e1针对e1训练一个模型m2,产生错误e2针对e2训练第三个模型m3,产生错误e3 …最终预测结果是:m1+m2+m3+…GB…

如何去除AI写作痕迹?笔灵去AI痕迹,提升论文质量

AI助手大集合&#xff0c;猛戳进来&#xff01; 在工作和生活中&#xff0c;我经常使用各种各样的人工智能工具&#xff0c;如AI写作软件、AI语音助手、AI绘图工具等。我发现&#xff0c;这些工具能够极大地提高工作效率并简化日常生活。作为一名AI工具的忠实爱好者&#xff0…

TortoiseGit的安装

TortoiseSvn和TortoiseGit都是针对代码进行版本管理的工具&#xff0c;又俗称小乌龟&#xff0c;简洁而可视化的操作界面&#xff0c;免去繁琐的命令行输入。只需要记住常用的几个操作步骤就能快速上手。 TortoiseGit安装 1、TortoiseGit作为git的版本管理工具 &#xff0c;但…

粘贴图片上传,显示剪切板中的图片

<van-cell-group inset><van-fieldpaste.native"(e) > handlePasting(e, index)"autosizeplaceholder"请将图片粘贴到此处"/> </van-cell-group> <div class"img-list"><divclass"img-item"v-for"…

在 Cython 中高效访问 scipy lil_matrix

在 Cython 中高效地访问 scipy 的 lil_matrix&#xff08;LInked List format&#xff09;可以通过以下步骤实现&#xff1a; 导入所需的模块&#xff1a; 首先&#xff0c;导入必要的模块&#xff0c;包括 numpy 和 scipy.sparse 中的 lil_matrix。定义函数原型&#xff1a; …

设备全生命周期管理平台:奏响设备管理的“高效乐章”

设备的全生命周期管理是一个复杂而关键的任务。设备的购买、安装、维护和报废都需要精细的管理和跟踪。然而&#xff0c;传统的设备管理方法往往效率低下、信息不准确&#xff0c;并且容易出现遗漏和错误。为解决这一问题&#xff0c;设备全生命周期管理平台应运而生。 设备全…

【Linux系统编程】基本指令(二)

目录 1、mv指令 2、cat指令 输出重定向 ​编辑 追加重定向 输入重定向 3、more指令 4、less指令 5、head指令 6、tail指令 与时间相关的指令 7、date指令 8、cal指令 9、find指令 10、grep指令 11、zip/unzip指令 1、mv指令 mv文件是用来对文件或目录进行重命名…

《新生向》什么是Python环境?

观前提醒&#xff1a;本文详细介绍了Python环境的结构&#xff0c;介绍了python虚拟环境基础用法&#xff0c;以及python中的环境&依赖管理 0.什么是Python环境 Python环境是指一个特定的设置&#xff0c;其中包含了运行Python代码所需的一系列软件工具和包。这个环境可以…

特斯拉FSD的硬件演进与模型压缩技术解析

引言 随着自动驾驶技术的迅速发展&#xff0c;特斯拉的全自动驾驶&#xff08;FSD&#xff09;系统也在不断进化。最近&#xff0c;特斯拉开始采用端到端的模型来优化其FSD算法&#xff0c;这种变革引发了广泛关注。本文将探讨特斯拉FSD在车载计算能力和模型压缩技术方面的最新…

基于EBAZ4205矿板的图像处理:12二值化图像的膨胀与腐蚀

基于EBAZ4205矿板的图像处理&#xff1a;12二值化图像的膨胀与腐蚀 先看效果 注意&#xff1a;我的项目中的膨胀和腐蚀是对二值化图像中的像素值为255的像素进行处理&#xff0c;而我的图像中255为白色&#xff0c;0为黑色&#xff0c;所以是对颜色为白色的像素点进行的膨胀和…

Axure “情形”的使用

这篇笔记的主要内容是如果在Axure中使用“情形”&#xff0c;对应在我们的研发中就是“判断条件”的使用 Axure情形的使用Axure添加caseAxure的if &#xff0c;sele if 条件判断 条件判断不管是在研发代码中还是实际生活中&#xff0c;无处不在&#xff0c;只是表现形式不同罢…

Python专题:十五、JSON数据格式

Python的数据处理&#xff1a;JOSN 计算机的主要工作&#xff1a;处理数据 最容易处理的数据就是结构化数据 非结构化数据&#xff1a;视频&#xff0c;文件等 近些年的大数据、数据挖掘就是对互联网中的各种非结构化的数据的分析和处理 半结构化数据 明确的结构属性&…

查询中Split函数不管用?试试这个自定义函数!

hi&#xff0c;大家好&#xff01; 我们在实际的应用中会有这样的一些情况&#xff0c;获取的一些数据是由一些特殊字符连接起来的&#xff0c;比如&#xff1a;XXX汽车\SUV\EV\纯电。类似这样的数据&#xff0c;我们在应用过程中&#xff0c;需要将数据拆开&#xff0c;如果用…

16-僵尸进程和托孤进程

进程的正常退出步骤&#xff1a; 子进程调用exit()函数退出父进程调用wait()函数为子进程处理其他事情 若进程没有按正常退出步骤&#xff0c;则有可能变为僵尸进程或者托孤进程 僵尸进程 子进程退出后&#xff0c;父进程没有调用wait()函数处理身后事&#xff0c;子进程变…

Web3 ETF软件开发技术

Web3 ETF&#xff08;交易所交易基金&#xff09;是一种基于区块链技术的ETF&#xff0c;它旨在跟踪Web3资产&#xff08;例如加密货币、NFT等&#xff09;的价值表现。Web3 ETF的开发涉及到传统ETF开发的所有技术难点&#xff0c;此外还有一些独特的挑战。北京木奇移动技术有限…