WPS代码

这段代码实现了一个基于Qt的主窗口类MainWindow,包含了新建、打开、保存、打印预览、撤销、重做等文本编辑器的基本功能。通过QSignalMapper管理子窗口,支持多种格式操作如字体样式、对齐方式和颜色设置。
摘要由CSDN通过智能技术生成

MainWindow.h

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include"childwnd.h"
#include<QSignalMapper>
#include<QMdiSubWindow>
#include<QtPrintSupport/Qprinter>

namespace Ui {
class MainWindow;
}

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    explicit MainWindow(QWidget *parent = 0);
    ~MainWindow();
    void initMainWindow();
    void docNew();
    void docOpen();
    void docSava();
    void docSavaAs();
    void docPrintf();
    void docPrintfPreview();
    void docUndo();
    void docRedo();
    void docCut();
    void docCopy();
    void docPaste();
    void textBold();
    void textItalic();
    void textUnderilne();
    void textFamily(const QString &fmly);
    void textSize(const QString &ps);
    void textColor();
    void paraStyle(int nStyle);

protected:
    void closeEvent(QCloseEvent *event);

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

    void on_closeAction_triggered();

    void on_closeAllAction_triggered();

    void on_titleAction_triggered();

    void on_cascadeAction_triggered();

    void on_nextAction_triggered();

    void on_previousAction_triggered();

    void setActiveSubWindow(QWidget*);

    void on_openAction_triggered();

    void on_savaAction_triggered();

    void on_savaASAction_triggered();

    void on_undoAction_triggered();

    void on_redoAction_triggered();

    void on_cutAction_triggered();

    void on_copyAction_triggered();

    void on_pastAction_triggered();

    void on_boldAction_triggered();

    void on_italicAction_triggered();

    void on_underLineAction_triggered();

    void on_fontComboBox_activated(const QString &arg1);

    void on_nubComboBox_activated(const QString &arg1);

    void on_leftAction_triggered();

    void on_rightAction_triggered();

    void on_centerAction_triggered();

    void on_justifyAction_triggered();

    void on_colorAction_triggered();

    void on_comboBox_activated(int index);

    void printfPreview(QPrinter *printer);

    void on_printfAction_triggered();

    void on_printfPreviewAction_triggered();

private:
    Ui::MainWindow *ui;
    void formatEnabled();
    childWnd *activateChildWnd();
    QSignalMapper *m_wndMapper;
    QMdiSubWindow* findChildWnd(const QString& docName);
};

#endif // MAINWINDOW_H

MainWindow.cpp

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include<QMdiSubWindow>
#include<QCloseEvent>
#include<QFileDialog>
#include<QColorDialog>
#include<QtPrintSupport/QPrintDialog>
#include<QtPrintSupport/QPrintPreviewDialog>

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    initMainWindow();
}

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

void MainWindow::initMainWindow()
{
    QFontDatabase fontdb;//从这个数据库中将字体大小遍历出来
    foreach (int fontsize, fontdb.standardSizes()) {
        ui->nubComboBox->addItem(QString::number(fontsize));
    }

    QFont defFont;//当前程序默认字体
    QString sFontSize;
    int defFontSize;//当前程序默认字号
    int defFontIndex;//当前字号在组合框内的索引

    defFont = QApplication::font();
    defFontSize = defFont.pointSize();
    sFontSize = QString::number(defFontSize);
    defFontIndex = ui->nubComboBox->findText(sFontSize);
    ui->nubComboBox->setCurrentIndex(defFontIndex);

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

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

    addSubWndListMenu();
    connect(ui->menu_W,&QMenu::aboutToShow,this,&MainWindow::addSubWndListMenu);

    //创建信号映射器
    m_wndMapper = new QSignalMapper(this);
    connect(m_wndMapper,SIGNAL(mapped(QWidget*)),
                this,SLOT(setActiveSubWindow(QWidget*)));

    //对齐方式,保持互斥性,每次只能选择一个
    QActionGroup *alignGroup = new QActionGroup(this);
    alignGroup->addAction(ui->leftAction);
    alignGroup->addAction(ui->rightAction);
    alignGroup->addAction(ui->centerAction);
    alignGroup->addAction(ui->justifyAction);

}

void MainWindow::docNew()
{
    childWnd *childwnd = new childWnd;
    ui->mdiArea->addSubWindow(childwnd);
    connect(childwnd,SIGNAL(copyAvailable(bool)),ui->cutAction,SLOT(setEnabled(bool)));
    connect(childwnd,SIGNAL(copyAvailable(bool)),ui->copyAction,SLOT(setEnabled(bool)));

    childwnd->newDoc();
    childwnd->show();
    formatEnabled();
}

void MainWindow::docOpen()
{
    QString docName = QFileDialog::getOpenFileName(this,"打开文档","",
                                                   "文本文件(*.txt);;"
                                                   "HTML文件(*.html *.htm);;"
                                                   "所有文件(*.*)");
    if(!docName.isEmpty()){
        QMdiSubWindow *existWnd = findChildWnd(docName);
        if(existWnd){
            ui->mdiArea->setActiveSubWindow(existWnd);
            return;
        }

        childWnd *childwnd = new childWnd;
        ui->mdiArea->addSubWindow(childwnd);

        //复制粘贴槽函数
        connect(childwnd,SIGNAL(copyAvailable(bool)),
                ui->cutAction,SLOT(setEnabled(bool)));
        connect(childwnd,SIGNAL(copyAvailable(bool)),
                ui->copyAction,SLOT(setEnabled(bool)));

        if(childwnd->loadDoc(docName)){
            statusBar()->showMessage("文档已打开",3000);
            childwnd->show();
            formatEnabled();
        }else{
            childwnd->close();
        }
    }

}

void MainWindow::docSava()
{
    if(activateChildWnd() && activateChildWnd()->savaDoc())
        statusBar()->showMessage("保存成功",3000);
}

void MainWindow::docSavaAs()
{
    if(activateChildWnd() && activateChildWnd()->savaAsDoc())
        statusBar()->showMessage("保存成功",3000);
}

void MainWindow::docPrintf()
{
    QPrinter pter(QPrinter::HighResolution);
    QPrintDialog *ddlg = new QPrintDialog(&pter,this);
    if(activateChildWnd())
        ddlg->setOption(QAbstractPrintDialog::PrintSelection,true);
    ddlg->setWindowTitle("打印文档");

    childWnd *childwnd = activateChildWnd();
    if(ddlg->exec() == QDialog::Accepted)
        childwnd->print(&pter);

    delete ddlg;
}

void MainWindow::docPrintfPreview()
{
    QPrinter pter;
    QPrintPreviewDialog preview(&pter,this);
    connect(&preview,SIGNAL(paintRequested(QPrinter*)),
            this,SLOT(printfPreview(QPrinter*)));
    preview.exec();
}

void MainWindow::docUndo()
{
       if(activateChildWnd())
           activateChildWnd()->undo();
}

void MainWindow::docRedo()
{
    if(activateChildWnd())
    activateChildWnd()->redo();
}

void MainWindow::docCut()
{
    if(activateChildWnd())
        activateChildWnd()->cut();
}

void MainWindow::docCopy()
{
    if(activateChildWnd())
        activateChildWnd()->copy();
}

void MainWindow::docPaste()
{
    if(activateChildWnd())
        activateChildWnd()->paste();
}

void MainWindow::textBold()
{
    QTextCharFormat fmt;
    fmt.setFontWeight(ui->boldAction->isChecked() ? QFont::Bold : QFont::Normal);
    if(activateChildWnd())
        activateChildWnd()->setFormatOnSelectedWord(fmt);
}

void MainWindow::textItalic()
{
    QTextCharFormat fmt;
    fmt.setFontItalic(ui->italicAction->isChecked());
    if(activateChildWnd())
        activateChildWnd()->setFormatOnSelectedWord(fmt);
}

void MainWindow::textUnderilne()
{
    QTextCharFormat fmt;
    fmt.setFontUnderline(ui->underLineAction->isChecked());
    if(activateChildWnd())
        activateChildWnd()->setFormatOnSelectedWord(fmt);
}

void MainWindow::textFamily(const QString &fmly)
{
    QTextCharFormat fmt;
    fmt.setFontFamily(fmly);
    if(activateChildWnd())
        activateChildWnd()->setFormatOnSelectedWord(fmt);
}

void MainWindow::textSize(const QString &ps)
{
    qreal pointSize = ps.toFloat();
    if(ps.toFloat() > 0){
        QTextCharFormat fmt;
        fmt.setFontPointSize(pointSize);
        if(activateChildWnd())
            activateChildWnd()->setFormatOnSelectedWord(fmt);
    }
}

void MainWindow::textColor()
{
    if(activateChildWnd()){
        //获取用户颜色选择
        QColor color = QColorDialog::getColor(activateChildWnd()->textColor(),this);

        QTextCharFormat fmt;
        fmt.setForeground(color);//设置文本颜色
        activateChildWnd()->setFormatOnSelectedWord(fmt);

        QPixmap pix(16,16);
        pix.fill(color);
        ui->colorAction->setIcon(pix);
    }
}

void MainWindow::paraStyle(int nStyle)
{
    if(activateChildWnd())
        activateChildWnd()->setParaStyle(nStyle);
}

void MainWindow::closeEvent(QCloseEvent *event)
{
    ui->mdiArea->closeAllSubWindows();
    if(ui->mdiArea->currentSubWindow())
        event->ignore();
    else
        event->accept();
}

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

void MainWindow::refreshMenus()
{
    bool hasChild;
    hasChild = (activateChildWnd() != 0);

    ui->savaAction->setEnabled(hasChild);
    ui->savaASAction->setEnabled(hasChild);
    ui->printfAction->setEnabled(hasChild);
    ui->previousAction->setEnabled(hasChild);
    ui->printfPreviewAction->setEnabled(hasChild);
    ui->pastAction->setEnabled(hasChild);
    ui->closeAction->setEnabled(hasChild);
    ui->closeAllAction->setEnabled(hasChild);
    ui->titleAction->setEnabled(hasChild);
    ui->cascadeAction->setEnabled(hasChild);
    ui->nextAction->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->leftAction->setEnabled(hasSelect);
    ui->centerAction->setEnabled(hasSelect);
    ui->rightAction->setEnabled(hasSelect);
    ui->justifyAction->setEnabled(hasSelect);
    ui->colorAction->setEnabled(hasSelect);

}

void MainWindow::addSubWndListMenu()
{
    ui->menu_W->clear();
    ui->menu_W->addAction(ui->closeAction);
    ui->menu_W->addAction(ui->closeAllAction);
    ui->menu_W->addSeparator();
    ui->menu_W->addAction(ui->titleAction);
    ui->menu_W->addAction(ui->cascadeAction);
    ui->menu_W->addSeparator();
    ui->menu_W->addAction(ui->nextAction);
    ui->menu_W->addAction(ui->previousAction);

    QList<QMdiSubWindow*> wnds = ui->mdiArea->subWindowList();
    if(!wnds.isEmpty()) ui->menu_W->addSeparator();

    for(int i=0; i<wnds.size(); ++i){
        childWnd* chilWnd = qobject_cast<childWnd*>(wnds.at(i)->widget());

        QString menuitem_text;
        menuitem_text = QString("%1%2").arg(i+1).arg(chilWnd->getCurDocName());

        QAction *menuitem_act = ui->menu_W->addAction(menuitem_text);
        menuitem_act->setCheckable(true);
        menuitem_act->setChecked(chilWnd == activateChildWnd());

        connect(menuitem_act,SIGNAL(triggered(bool)),m_wndMapper,SLOT(map()));

        m_wndMapper->setMapping(menuitem_act,wnds.at(i));
    }
    formatEnabled();
    }


void MainWindow::formatEnabled()
{
    ui->boldAction->setEnabled(true);
    ui->italicAction->setEnabled(true);
    ui->underLineAction->setEnabled(true);
    ui->leftAction->setEnabled(true);
    ui->centerAction->setEnabled(true);
    ui->rightAction->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;
}

QMdiSubWindow *MainWindow::findChildWnd(const QString &docName)
{
    QString strfile = QFileInfo(docName).canonicalFilePath();

    //遍历所有子窗口
    foreach (QMdiSubWindow *subWnd, ui->mdiArea->subWindowList()) {
        childWnd *childwnd = qobject_cast<childWnd*>(subWnd->widget());
        if(childwnd->m_CurDocPath == strfile) return subWnd;
    }
    return 0;
}



void MainWindow::on_closeAction_triggered()
{
    ui->mdiArea->closeActiveSubWindow();
}

void MainWindow::on_closeAllAction_triggered()
{
    ui->mdiArea->closeAllSubWindows();
}

void MainWindow::on_titleAction_triggered()
{
    ui->mdiArea->tileSubWindows();
}

void MainWindow::on_cascadeAction_triggered()
{
    ui->mdiArea->cascadeSubWindows();
}

void MainWindow::on_nextAction_triggered()
{
    ui->mdiArea->activateNextSubWindow();
}

void MainWindow::on_previousAction_triggered()
{
    ui->mdiArea->activatePreviousSubWindow();
}

void MainWindow::setActiveSubWindow(QWidget *wnd)
{
    if(!wnd)return;
ui->mdiArea->setActiveSubWindow(qobject_cast<QMdiSubWindow*>(wnd));
}

void MainWindow::on_openAction_triggered()
{
    docOpen();
}

void MainWindow::on_savaAction_triggered()
{
    docSava();
}

void MainWindow::on_savaASAction_triggered()
{
    docSavaAs();
}

void MainWindow::on_undoAction_triggered()
{
    docUndo();
}

void MainWindow::on_redoAction_triggered()
{
    docRedo();
}

void MainWindow::on_cutAction_triggered()
{
    docCut();
}

void MainWindow::on_copyAction_triggered()
{
    docCopy();
}

void MainWindow::on_pastAction_triggered()
{
    docPaste();
}

void MainWindow::on_boldAction_triggered()
{
    textBold();
}

void MainWindow::on_italicAction_triggered()
{
    textItalic();
}

void MainWindow::on_underLineAction_triggered()
{
    textUnderilne();
}

void MainWindow::on_fontComboBox_activated(const QString &arg1)
{
    textFamily(arg1);
}

void MainWindow::on_nubComboBox_activated(const QString &arg1)
{
    textSize(arg1);
}

void MainWindow::on_leftAction_triggered()
{
    if(activateChildWnd())
        activateChildWnd()->setAlignOfDocumentText(1);
}

void MainWindow::on_rightAction_triggered()
{
    if(activateChildWnd())
        activateChildWnd()->setAlignOfDocumentText(2);
}

void MainWindow::on_centerAction_triggered()
{
    if(activateChildWnd())
        activateChildWnd()->setAlignOfDocumentText(3);
}

void MainWindow::on_justifyAction_triggered()
{
    if(activateChildWnd())
        activateChildWnd()->setAlignOfDocumentText(4);
}

void MainWindow::on_colorAction_triggered()
{
    textColor();
}

void MainWindow::on_comboBox_activated(int index)
{
    paraStyle(index);
}

void MainWindow::printfPreview(QPrinter *printer)
{
    activateChildWnd()->print(printer);
}

void MainWindow::on_printfAction_triggered()
{
    docPrintf();
}

void MainWindow::on_printfPreviewAction_triggered()
{
    docPrintfPreview();
}

childWnd.h

#ifndef CHILDWND_H
#define CHILDWND_H
#include<QTextEdit>

class childWnd : public QTextEdit
{
    Q_OBJECT
public:
    childWnd();
    QString m_CurDocPath;//当前文件路径
    void newDoc();//新建文件
    QString getCurDocName();//文件路径中提取文件名
    bool loadDoc(const QString &docName);
    void setCurDoc(const QString &docName);
    bool savaDoc();
    bool savaAsDoc();
    bool savaDocOpt(QString docName);
    void setFormatOnSelectedWord(const QTextCharFormat &fmt);
    void setAlignOfDocumentText(int aligntype);
    void setParaStyle(int pStyle);

protected:
    void closeEvent(QCloseEvent *event);

private slots:
    void docBeModified();

private:
    bool m_bSavad;//文件是否保存
    bool promptSava();
};

#endif // CHILDWND_H

childWnd.cpp

#include "childwnd.h"
#include<QFileInfo>
#include<QFileDialog>
#include<QTextDocumentWriter>
#include<QMessageBox>
#include<QCloseEvent>
#include<QTextBlockFormat>
#include<QTextListFormat>
#include<QtWidgets>

childWnd::childWnd()
{
    //子窗口关闭时销毁该类的实例对象
    setAttribute(Qt::WA_DeleteOnClose);
    m_bSavad = 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();
}

bool childWnd::loadDoc(const QString &docName)
{
    if(!docName.isEmpty()){
        QFile file(docName);
        if(!file.exists()) return false;

        if(!file.open(QIODevice::ReadOnly)) return false;

        QByteArray text = file.readAll();
        if(Qt::mightBeRichText(text))
            setHtml(text);
        else
            setPlainText(text);
        setCurDoc(docName);
        connect(document(),SIGNAL(contentsChanged()),this,SLOT(docBeModified()));
        return true;
    }

}

void childWnd::setCurDoc(const QString &docName)
{
    //返回标准名称路径过滤 . ..
    m_CurDocPath = QFileInfo(docName).canonicalFilePath();
    m_bSavad = true;//设置文档已保存
    document()->setModified(false);//文档未改动
    setWindowModified(false);//窗口不显示改动标识
    setWindowTitle(getCurDocName() + "[*]");//设置子窗口标题

}

bool childWnd::savaDoc()
{
    if(m_bSavad)return savaDocOpt(m_CurDocPath);
    else savaAsDoc();
}

bool childWnd::savaAsDoc()
{
    QString docName = QFileDialog::getSaveFileName(this,
                                                   "另存为",
                                                   m_CurDocPath,
                                                   "HTML文档(*.html *.htm);;"
                                                   "所有文件(*.*)");
    if(docName.isEmpty()) return false;
    else return savaDocOpt(docName);
}

bool childWnd::savaDocOpt(QString docName)
{
    if(!(docName.endsWith(".htm",Qt::CaseInsensitive)||
            docName.endsWith(".html",Qt::CaseInsensitive))){
        docName += ".html";
    }

    QTextDocumentWriter wirter(docName);
    bool isSuccess = wirter.write(this->document());
    if(isSuccess) setCurDoc(docName);
    return isSuccess;
}

void childWnd::setFormatOnSelectedWord(const QTextCharFormat &fmt)
{
    QTextCursor tcurrsor = textCursor();
    if(!tcurrsor.hasSelection()) tcurrsor.select(QTextCursor::WordUnderCursor);
    tcurrsor.mergeCharFormat(fmt);
    mergeCurrentCharFormat(fmt);
}

void childWnd::setAlignOfDocumentText(int aligntype)
{
    if(aligntype ==1)
        setAlignment(Qt::AlignLeft | Qt::AlignAbsolute);
    else if(aligntype == 2)
        setAlignment(Qt::AlignRight | Qt::AlignAbsolute);
    else if(aligntype == 3)
        setAlignment(Qt::AlignCenter);
    else if(aligntype == 4)
        setAlignment(Qt::AlignJustify);
}

void childWnd::setParaStyle(int pStyle)
{
    QTextCursor tcursor = textCursor();
    QTextListFormat::Style sname;
    if(pStyle != 0){
        switch (pStyle) {
        case 1:
            sname = QTextListFormat::ListDisc;//黑心实心圆
            break;
        case 2:
            sname = QTextListFormat::ListCircle;//空心圆
            break;
        case 3:
            sname = QTextListFormat::ListSquare;//方形
            break;
        case 4:
            sname = QTextListFormat::ListDecimal;//十进制整数
            break;
        case 5:
            sname = QTextListFormat::ListLowerAlpha;//小写字母
            break;
        case 6:
            sname = QTextListFormat::ListUpperAlpha;//大写字母
            break;
        case 7:
            sname = QTextListFormat::ListLowerRoman;//小写罗马字母
            break;
        case 8:
            sname = QTextListFormat::ListUpperRoman;//大写罗马字母
            break;
        default:
            sname = QTextListFormat::ListDisc;
            break;
        }

        tcursor.beginEditBlock();//开始编辑文本块
        QTextBlockFormat tBlockFmt = tcursor.blockFormat();//文本格式
        QTextListFormat tListFmt;//标号格式
        if(tcursor.currentList()){
            tListFmt = tcursor.currentList()->format();
        }else{
            tListFmt.setIndent(tBlockFmt.indent() + 1);// 设置缩进
            tBlockFmt.setIndent(0);
            tcursor.setBlockFormat(tBlockFmt);
        }

        tListFmt.setStyle(sname);//设置标号风格
        tcursor.createList(tListFmt);

        tcursor.endEditBlock();//结束编辑文本块
    }else{
        QTextBlockFormat tbfmt;
        tbfmt.setObjectIndex(-1);//设置无效
        tcursor.mergeBlockFormat(tbfmt);
    }
}

void childWnd::closeEvent(QCloseEvent *event)
{
    if(promptSava())
        event->accept();
                else
        event->ignore();
}

void childWnd::docBeModified()
{
    setWindowModified(document()->isModified());
}

bool childWnd::promptSava()
{
    if(!document()->isModified()) return true;

    QMessageBox::StandardButton result;
    result = QMessageBox::warning(this,
                                  QString("系统提示"),
                                  QString("文档%1已修改!是否保存?").arg(getCurDocName()),
                                  QMessageBox::Yes|QMessageBox::Discard|QMessageBox::No);
    if(result == QMessageBox::Yes)
        return savaDoc();
    else if(result == QMessageBox::Discard)
        return false;
    else
        return true;
}

ui界面

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值