01WPS部分编写实现QT

news2024/11/21 0:15:09

1、新建项目

-创建wps类
-继承QMainWindow

2、菜单栏设置

在这里插入图片描述

3、开始实现操作

在这里插入图片描述
设置程序图标:

pro文件中添加 RC_ICONS += images/wps.ico  //后面这个是文件地址哈

1、字体选择大小设置
在这里插入图片描述

 
void MainWindow::initMainWindow()
{

    // 初始化字号列表项
    QFontDatabase fontdb; // 创建 QFontDatabase 对象,用于管理字体信息
    foreach(int fontsize, fontdb.standardSizes()) // 遍历标准字号列表
    {
        // 将当前字号添加到字号下拉框中
        ui->sizeComboBox->addItem(QString::number(fontsize));

        QFont defFont; // 定义 QFont 对象,用于获取当前默认的字体信息
        QString sFontSize; // 用于存储默认字体的字号的字符串形式
        int defFontSize; // 存储默认字体的字号
        int defFontIndex; // 存储在字号下拉框中的默认字号的索引位置

        defFont = QApplication::font(); // 获取当前应用程序的默认字体
        defFontSize = defFont.pointSize(); // 获取默认字体的字号
        sFontSize = QString::number(defFontSize); // 将字号转换为字符串形式
        defFontIndex = ui->sizeComboBox->findText(sFontSize); // 在字号下拉框中查找默认字号的索引位置

        ui->sizeComboBox->setCurrentIndex(defFontIndex); // 将字号下拉框设置为默认字号

        //滚动条多文档区域
        ui->mdiArea->setHorizontalScrollBarPolicy(Qt::ScrollBarAsNeeded);
        ui->mdiArea->setVerticalScrollBarPolicy(Qt::ScrollBarAsNeeded);

        refreshMenus();
        connect(ui->mdiArea,&QMdiArea::subWindowActivated,this,&MainWindow::refreshMenus);
    }

}

2、子类ChildWmd设置

头文件:
#ifndef CHILDWND_H
#define CHILDWND_H

#include <QTextEdit>
#include <QObject>

class ChildWnd : public QTextEdit
{
    Q_OBJECT
public:
    ChildWnd();
    QString m_CurDocPath; //当前文档路径
    void newDoc(); //新建文档
    QString getCurDocName();//文档路径中提取文档名

private slots:
    void docBeModified(); //文件修改时候,加*
private:
    bool m_bSaved; //文档是否保存

};

#endif // CHILDWND_H

实现文件:
#include "childwnd.h"
#include<QFileDialog>
#pragma execution_character_set("utf-8");
ChildWnd::ChildWnd()
{
    setAttribute(Qt::WA_DeleteOnClose); //子窗口关闭销毁该类的实例对象

    m_bSaved = false;
}

void ChildWnd::newDoc()
{
    static int wndSeqNum = 1;
    m_CurDocPath = QString("WPS 文档 %1").arg(wndSeqNum++);

    //设置窗体把标题,文档改动后加*
    setWindowTitle(m_CurDocPath+"[*]"+" - MyWPS");
    connect(document(),SIGNAL(contentsChanged()),this,SLOT(docBeModified()));

}

QString ChildWnd::getCurDocName()
{
    return QFileInfo(m_CurDocPath).fileName();

}

void ChildWnd::docBeModified()
{
    setWindowModified(document()->isModified()); //文档是否被修改

}


效果展示:
在这里插入图片描述

window中的头文件:
#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include "childwnd.h"
QT_BEGIN_NAMESPACE
namespace Ui { class MainWindow; }
QT_END_NAMESPACE

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    MainWindow(QWidget *parent = nullptr);
    ~MainWindow();

private:
    Ui::MainWindow *ui;

public:
    void initMainWindow();
    void docNew();

private slots:
//    void on_newAction_triggered();
    void on_newAction_triggered();
    void refreshMenus();

private:
    void formatEnabled();
    ChildWnd *activateChildWnd();

};
#endif // MAINWINDOW_H
window中的实现代码:
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include"childwnd.h"
#include<QMdiSubWindow>
MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    initMainWindow();
}

MainWindow::~MainWindow()
{
    delete ui;
}

void MainWindow::initMainWindow()
{

    // 初始化字号列表项
    QFontDatabase fontdb; // 创建 QFontDatabase 对象,用于管理字体信息
    foreach(int fontsize, fontdb.standardSizes()) // 遍历标准字号列表
    {
        // 将当前字号添加到字号下拉框中
        ui->sizeComboBox->addItem(QString::number(fontsize));

        QFont defFont; // 定义 QFont 对象,用于获取当前默认的字体信息
        QString sFontSize; // 用于存储默认字体的字号的字符串形式
        int defFontSize; // 存储默认字体的字号
        int defFontIndex; // 存储在字号下拉框中的默认字号的索引位置

        defFont = QApplication::font(); // 获取当前应用程序的默认字体
        defFontSize = defFont.pointSize(); // 获取默认字体的字号
        sFontSize = QString::number(defFontSize); // 将字号转换为字符串形式
        defFontIndex = ui->sizeComboBox->findText(sFontSize); // 在字号下拉框中查找默认字号的索引位置

        ui->sizeComboBox->setCurrentIndex(defFontIndex); // 将字号下拉框设置为默认字号

        //滚动条多文档区域
        ui->mdiArea->setHorizontalScrollBarPolicy(Qt::ScrollBarAsNeeded);
        ui->mdiArea->setVerticalScrollBarPolicy(Qt::ScrollBarAsNeeded);

        refreshMenus();
        connect(ui->mdiArea,&QMdiArea::subWindowActivated,this,&MainWindow::refreshMenus);
    }

}

void MainWindow::docNew()
{
    // 创建新的子窗口对象
    ChildWnd *childwnd = new ChildWnd;
    
    // 将子窗口添加到 MDI 区域中
    ui->mdiArea->addSubWindow(childwnd);
    
    // 当子窗口中有文本选择时,使剪切和复制操作项可用
    connect(childwnd, SIGNAL(copyAvailable(bool)), ui->cutAction, SLOT(setEnabled(bool)));
    connect(childwnd, SIGNAL(copyAvailable(bool)), ui->copyAction, SLOT(setEnabled(bool)));
    
    // 调用子窗口的 newDoc 函数,初始化新的文档
    childwnd->newDoc();
    
    // 显示子窗口
    childwnd->show();
    
    // 根据当前格式设置,更新菜单栏中的相关操作项的可用状态
    formatEnabled();
}


void MainWindow::formatEnabled()
{
    ui->boldAction->setEnabled(true);
    ui->italicAction->setEnabled(true);
    ui->underlineAction->setEnabled(true);
    ui->leftAlignAction->setEnabled(true);
    ui->centerAlignAction->setEnabled(true);
    ui->rightAlignAction->setEnabled(true);
    ui->justifyAction->setEnabled(true);
    ui->colorAction->setEnabled(true);


}

ChildWnd *MainWindow::activateChildWnd()
{
    QMdiSubWindow*actWnd = ui->mdiArea->activeSubWindow();//返回自创接口
    if(actWnd)
        return qobject_cast<ChildWnd*>(actWnd->widget());
    else
        return 0;
}


void MainWindow::on_newAction_triggered()
{
    docNew();
}

void MainWindow::refreshMenus() //设置选择状态可有的操作
{
    bool hasChild = false;
    hasChild = (activateChildWnd()!=0);

    ui->saveAction->setEnabled(hasChild);
    ui->saveAsAction->setEnabled(hasChild);
    ui->printAction->setEnabled(hasChild);
    ui->printPreviewAction->setEnabled(hasChild);
    ui->pasteAction->setEnabled(hasChild);
    ui->closeAction->setEnabled(hasChild);
    ui->closeAllAction->setEnabled(hasChild);
    ui->titleAction->setEnabled(hasChild);
    ui->cascadeAction->setEnabled(hasChild);
    ui->nextAction->setEnabled(hasChild);
    ui->previousAction->setEnabled(hasChild);

    bool hasSelect = (activateChildWnd()&&activateChildWnd()->textCursor().hasSelection());
    ui->cutAction->setEnabled(hasSelect);
    ui->copyAction->setEnabled(hasSelect);
    ui->boldAction->setEnabled(hasSelect);
    ui->italicAction->setEnabled(hasSelect);
    ui->underlineAction->setEnabled(hasSelect);
    ui->leftAlignAction->setEnabled(hasSelect);
    ui->centerAlignAction->setEnabled(hasSelect);
    ui->rightAlignAction->setEnabled(hasSelect);
    ui->justifyAction->setEnabled(hasSelect);
    ui->colorAction->setEnabled(hasSelect);

}


效果展示:
在这里插入图片描述

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

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

相关文章

Sarcasm detection论文解析 |# 利用情感语义增强型多层次记忆网络进行讽刺检测

论文地址 论文地址&#xff1a;https://www.sciencedirect.com/science/article/abs/pii/S0925231220304689?via%3Dihub#/ 论文首页 笔记框架 利用情感语义增强型多层次记忆网络进行讽刺检测 &#x1f4c5;出版年份:2020 &#x1f4d6;出版期刊:Neurocomputing &#x1f4c8;影…

预测市场?预测股票?如何让预测有更高的准确率?

我们发现在足球赛中&#xff0c;只要知道一个简单的讯息&#xff08;主队过去的获胜机率超过一半&#xff09;&#xff0c;预测力就会明显好过随便乱猜。如果再加上第二个简单的讯息&#xff08;胜负纪录较佳的队伍会略占优势&#xff09;&#xff0c;可以再进一步提升预测力。…

TinySeg:模型优化框架

TinySeg:模型优化框架 摘要Background & MotivationThe TinySeg Model OptimizerThe TinySeg RuntimeEvaluation TinySeg: Model Optimizing Framework for 摘要 图像分割是计算机视觉任务中的主要组成部分&#xff0c;适用于各种领域&#xff0c;如无人机的自主导航。然而…

合并果子

借助这一道题目来严谨证明一下Huffman树的构造方法的正确性 对任意一颗\(k\)叉huffman树&#xff0c;他都可以等价于一个类似于合并果子的过程&#xff0c;即每次取出最多\(k\)个点进行合并&#xff0c;然后\(k\)个点的权值和就是新的点的权值&#xff0c;然后把这个新的点加入…

5.9号模拟前端面试10问

5.9号模拟前端面试10问 1.html语义化的理解 HTML语义化是指使用具有明确含义的HTML标签来描述内容&#xff0c;而不仅仅是使用<div>和<span>等通用容器标签。语义化的HTML代码更易于阅读和维护&#xff0c;同时也有助于搜索引擎优化&#xff08;SEO&#xff09;。…

【微机原理及接口技术】存储器

【微机原理及接口技术】存储器 文章目录 【微机原理及接口技术】存储器前言一、半导体存储器技术1.半导体存储器概述2.半导体存储器的分类3.半导体存储器芯片的结构 二、半导体存储器芯片1.RAM芯片2.ROM芯片 三、半导体存储器与CPU的连接1.存储芯片数据线的连接2.存储芯片地址线…

Vue、React实现excel导出功能(三种实现方式保姆级讲解)

第一种&#xff1a;后端返回文件流&#xff0c;前端转换并导出&#xff08;常用&#xff0c;通常公司都是用这种方式&#xff09; 第二种&#xff1a;纯后端导出&#xff08;需要了解&#xff09; 第三种&#xff1a;纯前端导出&#xff08;不建议使用&#xff0c;数据处理放…

【2024华为HCIP831 | 高级网络工程师】刷题日记(16)

个人名片&#xff1a;&#x1faaa; &#x1f43c;作者简介&#xff1a;一名大三在校生&#xff0c;喜欢AI编程&#x1f38b; &#x1f43b;‍❄️个人主页&#x1f947;&#xff1a;落798. &#x1f43c;个人WeChat&#xff1a;hmmwx53 &#x1f413;每日一句&#xff1a;&…

软件接口测试规范流程

1、需求分析 1.1 确认测试目的和测试对象&#xff1a; 了解需求并明确测试目的&#xff0c;如测试一个本地 API 还是跨网站的远程 API。 1.2 确认测试的基本条件: 确定测试所需的测试数据&#xff0c;测试环境以及测试团队中的角色和职责。 1.3. 对接口文档进行验证&#xf…

「网络流 24 题」方格取数 【最大独立集、最小割】

「网络流 24 题」方格取数 思路 首先我们将每一个相邻关系抽象成边&#xff0c;问题就转化为&#xff1a;选择若干个点&#xff0c;并且满足所选点集内部没有边&#xff0c;那么这就是一个最大点权独立集的问题 如果点权全为一我们就可以利用二分图的匈牙利算法来解决&#x…

WEB基础--单元测试与三层架构

单元测试 为什么要进行单元测试 减少创建类&#xff0c;我们希望在一个类中&#xff0c;并且测试时不需要改代码&#xff0c;那么我们就要用到junit单元测试 常见测试分类 黑盒测试 黑盒测试也叫功能测试&#xff0c;主要关注软件每个功能是否实现&#xff0c;并不关注软件代…

【源码+文档+调试教程】基于微信小程序的电子购物系统的设计与实现

摘 要 由于APP软件在开发以及运营上面所需成本较高&#xff0c;而用户手机需要安装各种APP软件&#xff0c;因此占用用户过多的手机存储空间&#xff0c;导致用户手机运行缓慢&#xff0c;体验度比较差&#xff0c;进而导致用户会卸载非必要的APP&#xff0c;倒逼管理者必须改…

H5228 DCDC 6.5-75V LED升降压恒流芯片IC,支持12V24V36V48V60V PWM、模拟和数转模调光

PWM&#xff08;脉冲宽度调制&#xff09;、模拟和数转模调光DCDC电源管理芯片的工作原理涉及多个方面。 首先&#xff0c;对于PWM调光&#xff0c;其基本原理是通过控制脉冲的宽度来调节LED的亮度。具体来说&#xff0c;当PWM信号为高电平时&#xff0c;LED亮起&#xff1b;当…

数据结构的堆(c语言版)

一.堆的概念 1.堆的基本概念 在计算机科学中&#xff0c;堆是一种特殊的数据结构&#xff0c;通常用于实现优先队列和动态分配内存。 2.堆的特征 堆是一个完全二叉树&#xff0c;它具有以下两个主要特性&#xff1a; 堆序性&#xff1a;对于最大堆&#xff0c;在堆中的任意节…

LeetCode例题讲解:只出现一次的数字

给你一个 非空 整数数组 nums &#xff0c;除了某个元素只出现一次以外&#xff0c;其余每个元素均出现两次。找出那个只出现了一次的元素。 你必须设计并实现线性时间复杂度的算法来解决此问题&#xff0c;且该算法只使用常量额外空间。 示例 1 &#xff1a; 输入&#xff…

线程的常见方法

线程的常见方法 休眠&#xff1a; 让当前状态不再参与cpu的竞争&#xff0c;直到休眠结束&#xff1b; 结果&#xff1a;并不是完全交替进行的&#xff0c;因为只是休眠状态&#xff0c;也会存在争抢cpu 放弃&#xff1a; 让当前状态主动放弃时间片&#xff0c;下次再去争抢…

js原生手写一个拖拽小功能

先上效果图 附上代码 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8" /><meta http-equiv"X-UA-Compatible" content"IEedge" /><meta name"viewport" content"widthd…

压缩和归档库-LZ4介绍

1.简介 LZ4是一种快速的压缩算法&#xff0c;提供压缩和解压缩的速度&#xff0c;而牺牲了压缩率。它被设计用于快速的数据压缩和解压缩&#xff0c;特别是用于数据存储和传输。LZ4通常用于需要高速数据处理的场景&#xff0c;如数据库、日志文件处理和实时数据传输。 LZ4的特…

LeetCode例题讲解:快乐数

编写一个算法来判断一个数 n 是不是快乐数。 「快乐数」 定义为&#xff1a; 对于一个正整数&#xff0c;每一次将该数替换为它每个位置上的数字的平方和。然后重复这个过程直到这个数变为 1&#xff0c;也可能是 无限循环 但始终变不到 1。如果这个过程 结果为 1&#xff0c…

C++青少年简明教程:基础知识

C青少年简明教程&#xff1a;基础知识 电脑程序设计&#xff08;Computer programming&#xff09;&#xff0c;或称程序设计&#xff08;programming&#xff09;&#xff0c;是给出解决特定问题程序的过程&#xff0c;程序设计往往以某种程序设计语言为工具&#xff0c;给出这…