01WPS部分编写实现QT

发布于:2024-05-09 ⋅ 阅读:(26) ⋅ 点赞:(0)

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);

}


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


网站公告

今日签到

点亮在社区的每一天
去签到