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.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.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界面