Qt WPS(有源码)

项目源码地址:WPS完整源码

一.项目详情

该项目仿照WPS,实现了部分的功能,能够很方便对文本和HTML进行修改,并且有打印功能,可以很方便的生成PDF。

  • 应用界面
    在这里插入图片描述
  • 项目架构分析
    这个项目主要可分为两个部分,一个是主窗体类,一个是文本编辑窗口,主窗体的中心部件是MDI容器,可以很方便的实现内嵌部件(也就是文本编辑类)

二. 项目部分功能结束

1.打印功能

这个功能核心的不是对QPrintDialog的运用

void MainWindow::on_actionPrint_triggered()
{
    TextEdit*edit=activateWindow();
    if(!edit) return ;

    //QPrinter::HighResolution 将Printer的分辨率设置为正在使用的打印机的分辨率
    QPrinter printer(QPrinter::HighResolution);

    //QPrintDialog 提供了一个用于指定打印机配置的对话框
    QPrintDialog dialog(&printer,this);

    //启用打印选定内容选项
//    dialog.setOption(QAbstractPrintDialog::PrintSelection,true);
//    printer.setPrintRange(QPrinter::Selection);//设置打印范围,打印选定文本

    if(dialog.exec()==QPrintDialog::Accepted)
    {
        edit->print(&printer);
    }


}

-打印界面
在这里插入图片描述

  • 预览界面
    在这里插入图片描述

2.信号映射器实现

在窗口下可以排列出当前MDI所显示的窗口信息,并且通过映射可以选中指定的窗口作为活动窗口。这个功能的核心主要是对QActionGroup活动组和QSignalMapper信号映射器的使用。

//aboutToShow在菜单显示出来之前要发出的
    connect(ui->menu_W,&QMenu::aboutToShow,this,&MainWindow::addSubWindowAction);

    connect(mapper,SIGNAL(mapped(QWidget*)),this,SLOT(setActiveSubWindow(QWidget *)));
    
  1. 对窗口显示进行绑定,当点击窗口的时候,立即通过addSubWindowAction对窗口显示信息进行修改。

  2. mapper实现的功能是将窗口显示信息作为键,而窗口作为值,两者进行绑定。

void MainWindow::addSubWindowAction()
{
    QList<QAction*> actionList=actionGroup->actions();
    if(!actionList.isEmpty())//释放掉之前所有资源
    {
        for(QAction*action:actionList)
        {
            delete action;
        }
    }



    QList<QMdiSubWindow *> subWindowList = ui->mdiArea->subWindowList();//获取子窗体列表
   if(!subWindowList.isEmpty())
   {
       ui->menu_W->addSeparator();//添加分隔符
   }

   for(int i=0;i<subWindowList.count();i++)
   {
       QMdiSubWindow*subWindow = subWindowList[i];//获取子窗体
       TextEdit*edit=qobject_cast<TextEdit*>(subWindow->widget());//获取内嵌部件

       QString action_text=QString("%1 %2").arg(i+1).arg(edit->getDocWindowTitle());

       QAction*action = ui->menu_W->addAction(action_text);
       actionGroup->addAction(action);
       action->setCheckable(true);

       if(edit==activateWindow())
       {
           action->setChecked(true); //对应活动窗口设置为选中状态
       }

       //将action的triggered信号传递给信号映射器mapper,然后由mapper进行统一转发
       connect(action,SIGNAL(triggered(bool)),mapper,SLOT(map()));

       mapper->setMapping(action,subWindow);//添加映射,设置信号发送对象与要发送的对象
   }


}

void MainWindow::setActiveSubWindow(QWidget *widget)
{
    //父类指针可以指向子类
    if(widget) ui->mdiArea->setActiveSubWindow(qobject_cast<QMdiSubWindow*>(widget));


}

在这里插入图片描述

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

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

相关文章

长鑫存储母公司斥资24亿美元发展国产HBM

国产DRAM厂商长鑫存储母公司睿力集成计划投资24亿美元在上海建一座高端封装工厂。据报道&#xff0c;该工厂将专注于高带宽存储器&#xff08;HBM&#xff09;芯片的封装&#xff0c;预计到2026年中开始投入生产。长鑫存储将利用来自多方投资者的资金进行建设&#xff0c;其中包…

ElementUI框架搭建及组件使用

前言: 当开始使用ElementUI框架来搭建网站或Web应用程序时&#xff0c;了解框架的基本结构和组件的使用是至关重要的。ElementUI是一个基于Vue.js的框架&#xff0c;提供了丰富的UI组件和工具&#xff0c;可以帮助开发人员快速构建现代化的用户界面。 在本文中&#xff0c;我…

Go Error 处理

&#x1f49d;&#x1f49d;&#x1f49d;欢迎莅临我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:「stormsha的主页」…

如何正确使用C#短信接口发送招生短信

群发短信对教育机构来讲虽然是个不错的招生工具,但怎么使用决定着生源转化效率,如果是为了单纯的发短信而发短信效率当然不好,那么如何正确使用招生群发短信呢?技巧才是关键! 教育短信发送较多的就是招生群发短信内容,而运营商对教育行业内容审核一般比较严格,需要短信公司特殊…

springboot 3.x相比之前版本有什么区别

Spring Boot 3.x相比之前的版本&#xff08;尤其是Spring Boot 2.x&#xff09;&#xff0c;主要存在以下几个显著的区别和新特性&#xff1a; Java版本要求&#xff1a; Spring Boot 3.x要求至少使用Java 17作为最低版本&#xff0c;同时已经通过了Java 19的测试&#xff0c;…

如何焊铜管 量测射频前端模块

先说结论 要做Port Extension待测物要上电 且根据逻辑表给Enable pin上电网分输入功率 不要太大 -20dBm即可铜管的接地 要足够 以及足够近铜管与待测物之间 必要时 隔一颗电容不要将匹配元件 也包含在量测范围讯号针不要直接焊在焊盘上 首先 铜管要做Port…

Amazon Q——2023 re:Invent 大会的 AI 革新之星

引言 在2023年的 re:Invent 大会上&#xff0c;亚马逊云科技&#xff08;亚马逊云科技&#xff09;不仅展示了包括 Amazon Graviton3、Amazon SageMaker Studio Lab、Amazon Connect Wisdom、Amazon QuickSight Q 和 Amazon Private 5G 在内的多项创新产品&#xff0c;还发布了…

动手学深度学习(Pytorch版)代码实践 -计算机视觉-47转置卷积

47转置卷积 import torch from torch import nn from d2l import torch as d2l# 输入矩阵X和卷积核矩阵K实现基本的转置卷积运算 def trans_conv(X, K):h, w K.shapeY torch.zeros((X.shape[0] h - 1, X.shape[1] w - 1))for i in range(X.shape[0]):for j in range(X.shap…

MySQL高级-InnoDB引擎-事务日志- redo log(事务持久性的保证)

文章目录 1、redo log1.1、重做日志缓冲&#xff08;redo log buffer&#xff09;1.2、重做日志文件&#xff08;redo log file&#xff09; 2、如果没有redo log&#xff0c;可能会存在什么问题的&#xff1f;2.2、我们一起来分析一下。 2.2、那么&#xff0c;如何解决上述的问…

MySQL高级-SQL优化- group by 优化(通过索引来提高效率)

文章目录 0、group by 优化1、删除多余的索引2、查询 group by profession3、执行计划 group by profession4、创建联合索引 idx_user_pro_age_sta5、再次执行计划 group by profession6、执行计划 group by age7、执行计划 group by profession,age8、执行计划 where professi…

2-requests模块(6节课学会爬虫)

2-requests模块&#xff08;6节课学会爬虫&#xff09; 1&#xff0c;安装requests2&#xff0c;发送get&#xff0c;post请求&#xff0c;获取响应3&#xff0c;response的方法方法一&#xff08;Response.text&#xff09;方法二&#xff08;response.content.decode()&#…

基于springboot实现学生用品采购系统项目【项目源码+论文说明】

基于springboot实现学生用品采购系统演示 摘要 传统办法管理信息首先需要花费的时间比较多&#xff0c;其次数据出错率比较高&#xff0c;而且对错误的数据进行更改也比较困难&#xff0c;最后&#xff0c;检索数据费事费力。因此&#xff0c;在计算机上安装学生用品采购系统软…

《昇思25天学习打卡营第6天|onereal》

Vision Transformer&#xff08;ViT&#xff09;简介 近些年&#xff0c;随着基于自注意&#xff08;Self-Attention&#xff09;结构的模型的发展&#xff0c;特别是Transformer模型的提出&#xff0c;极大地促进了自然语言处理模型的发展。由于Transformers的计算效率和可扩…

YOLOv10(7):YOLOv10训练(以训练VOC数据集为例)

YOLOv10&#xff08;1&#xff09;&#xff1a;初探&#xff0c;训练自己的数据_yolov10 训练-CSDN博客 YOLOv10&#xff08;2&#xff09;&#xff1a;网络结构及其检测模型代码部分阅读_yolov10网络结构图-CSDN博客 YOLOv10&#xff08;4&#xff09;&#xff1a;损失&…

MapReduce学习

目录 7.3 MapReduce工作流程 7.3.1 工作流程概述 7.3.2 MapReduce各个执行阶段 7.3.3 Shuffle过程详解 1. Shuffle过程简介&#xff08;过程分为Map端的操作和Reduce端的操作&#xff09; 2、Map端的Shuffle过程&#xff1a; 3、在Reduce端的Shuffle过程 7.4 实例分析&am…

mysql是什么

mysql是什么 是DBMS软件系统&#xff0c;并不是一个数据库&#xff0c;管理数据库 DBMS相当于用户和数据库之间的桥梁&#xff0c;有超过300种不同的dbms系统 mysql是关系型数据库&#xff0c;关系型数据库存储模型很想excel&#xff0c;用行和列组织数据 sql是一门编程语言…

LUA 语言中subtree 的使用教程

在线编辑器&#xff1a; https://www.runoob.com/try/runcode.php?filenameHelloWorld&typelua 在Lua语言中&#xff0c;"subtree"通常指的是一个子表或者子树&#xff0c;它指的是一个Lua表&#xff08;table&#xff09;中的一个部分&#xff0c;可以是一个单…

自定义注解+AOP形式监控接口调用日志

目的&#xff1a; 通过自定义注解&#xff0c;在需要监控接口调用输出日志的类或方法上&#xff0c;加上自定义注解&#xff0c;实现无侵入式接口监控。 实现&#xff1a; idea结构 1、导入pom <dependency><groupId>org.aspectj</groupId><artifactI…

你的 Python 代码太慢了吗?协程和多线程来拯救!

目录 协程&#xff08;Coroutine&#xff09; 多线程&#xff08;Multithreading&#xff09; 协程与多线程的原理 协程的原理 多线程的原理 实践案例 使用协程案例 使用多线程案例 大家好&#xff0c;在Python编程中&#xff0c;处理并发任务时&#xff0c;我们经常会…

LLM大模型:如何选择合适的 Embedding 模型?

检索增强生成&#xff08;RAG&#xff09;是生成式 AI &#xff08;GenAI&#xff09;中的一类应用&#xff0c;支持使用自己的数据来增强 LLM 模型&#xff08;如 ChatGPT&#xff09;的知识。 RAG 通常会用到三种不的AI模型&#xff0c;即 Embedding 模型、Rerankear模型以及…