1. 程式人生 > >Qt版Word字處理軟體

Qt版Word字處理軟體

演示介面
mychild.h
#ifndefMYCHILD_H
#defineMYCHILD_H
#include<QTextEdit>
#include<QPrinter>
classMyChild:publicQTextEdit
{
Q_OBJECT
public:
MyChild();
voidnewFile();//新建操作
boolloadFile(constQString&fileName);//載入檔案
boolsave();//儲存檔案
boolsaveAs();//另存為
boolsaveFile(QString
fileName);
voidsetAlign(intalign);//設定段落對齊格式
voidsetStyle(intstyle);//設定段落標號、編號
QStringuserFriendlyCurrentFile();//提取檔名
QStringcurrentFile(){returncurFile;}//返回當前檔案路徑
voidmergeFormatOnWordOrSelection(constQTextCharFormat&format);//字型格式設定
protected:
voidcloseEvent(QCloseEvent*event);
privateslots
:
voiddocumentWasModified();//文件被修改時,視窗顯示更改狀態標識
private:
boolmaybeSave();//提醒儲存檔案操作
QStringstrippedName(constQString&fullFileName);//獲取較短的絕對路徑
voidsetCurrentFile(constQString&fileName);//設定當前檔案的屬性
QStringcurFile;//儲存當前檔案路徑
boolisUntitled;//作為當前檔案是否被儲存到硬碟上的標識
};
#endif//MYCHILD_H
mychild.cpp
#include
"mychild.h"
#include<QtWidgets>
MyChild::MyChild()
{
setAttribute(Qt::WA_DeleteOnClose);//設定在子視窗關閉時銷燬這個類的物件
isUntitled=true;//初始化isUntitled為true
}
/*
*新建檔案操作
*1、設定視窗編號
*2、設定檔案未被儲存過“isUntitled=true”
*3、儲存檔案路徑,為curFile賦初值
*4、設定子視窗標題
*5、文聯文件內容改變訊號contentsChanged()至顯示文件更改狀態標識槽documentWasModified()
*
*static區域性變數只被初始化一次,下一次依據上一次的結果值
*/
voidMyChild::newFile()
{
//設定視窗編號,因為編號會一直被儲存,所以需要使用靜態變數
staticintsequenceNumber=1;
//新建的文件預設未命名
isUntitled=true;
//將當前檔案命名為“文件+編號”的形式,編號先使用在加1
curFile=tr("文件%1").arg(sequenceNumber++);
//設定視窗標題,使用[*]可以在文件被更改在檔名稱後顯示“*”號
setWindowTitle(curFile+"[*]"+tr("-MyselfWord"));
//文件更改時傳送contentSChanged()訊號,執行documentWasModified()槽函式
connect(document(),SIGNAL(contentsChanged()),this,SLOT(documentWasModified()));
}
/*
*載入檔案操作步驟
*1、開啟指定的檔案,並讀取檔案內容到編輯器
*2、設定當前檔案的setCurrentFile(),該函式可以獲取檔案路徑,完成檔案和視窗狀態的設定
*3、關聯文件內容改變訊號到顯示文件更改狀態標誌槽documentWasModified()。載入檔案操作採用loadFile()函式實現
*/
boolMyChild::loadFile(constQString&fileName)
{
if(!fileName.isEmpty())
{
if(!QFile::exists(fileName))
{
returnfalse;
}
//新建QFile物件
QFilefile(fileName);
//以只讀方式開啟檔案,出錯則提示,並返回false
if(!file.open(QFile::ReadOnly))
{
returnfalse;
}
QByteArraydata=file.readAll();
/*通過檢查BOM(位元組順序標記)和內容型別的元頭,並能夠解碼成Unicode的html返回QTextCodec例項。Qt使用Unicode
儲存,操作字元,提供了一套QTextCodec類。去幫助轉換非Unicode格式到Unicode*/
QTextCodec*codec=Qt::codecForHtml(data);
QStringstr=codec->toUnicode(data);
//如果是純文字
if(Qt::mightBeRichText(str))
{
/*如果你有現成的HTML檔案,則可以直接呼叫setHtml()方法來載入*/
this->setHtml(str);
}
else
{
str=QString::fromLocal8Bit(data);
/*setPlainText()顧名思義,是設定純文字。而setText引數除了可以設定為純文字之外,還可以設定為一些簡單
的html格式的字串,當然這些字串是修飾一個字串。*/
this->setPlainText(str);
}
setCurrentFile(fileName);
connect(document(),SIGNAL(contentsChanged()),this,SLOT(documentWasModified()));
returntrue;
}
}
/*
*儲存檔案
*1、如果檔案沒有被儲存過(用isUntitled判斷),則執行“另存為”操作saveAs()。
*2、否則直接“儲存”檔案saveFile(),該函式首先開啟指定檔案,然後將編輯器的內容寫入該檔案,最後設定當前檔案setCurrentFIle()
*/
boolMyChild::save()
{
if(isUntitled)
{
returnsaveAs();
}
else
{
returnsaveFile(curFile);
}
}
/*
*另存為
*1、從檔案對話方塊獲取檔案路徑。
*2、如果路徑不為空,則儲存檔案saveFile()
*/
boolMyChild::saveAs()
{
QStringfileName=QFileDialog::getSaveFileName(this,tr("另存為"),curFile,tr("HTML文件(*.htm*.html);所有檔案(*.*)"));
//獲取檔案路徑,如果為空則返回false,否則儲存檔案
if(fileName.isEmpty())
{
returnfalse;
}
returnsaveFile(fileName);
}
/*
*儲存檔案
*/
boolMyChild::saveFile(QStringfileName)
{
//如果字串的結尾引用.htm或者.html則返回true,否則返回false。忽略大小寫
if(!(fileName.endsWith(".htm",Qt::CaseInsensitive)||fileName.endsWith(".html",Qt::CaseInsensitive)))
{
fileName+=".html";//預設儲存為HTML文件
}
//儲存檔案對話方塊(對於某些格式QTextDocumentWriter可直接儲存,其他不支援的格式就用QTextStream以流的形式儲存
QTextDocumentWriterwriter(fileName);
boolsuccess=writer.write(this->document());
if(success)
setCurrentFile(fileName);
returnsuccess;
}
/*
*另存為檔案操作(Remindthesavefile)
*/
boolMyChild::maybeSave()
{
//首先判斷文件是否被修改過,如果文件被修改過執行if(){}下面的內容
if(!document()->isModified())
{
returntrue;
}
QMessageBox::StandardButtonret;
ret=QMessageBox::warning(this,tr("MyselfQtWord"),tr("文件'%1'已被修改,儲存嗎?").arg(userFriendlyCurrentFile()),QMessageBox::Save|QMessageBox::Cancel|QMessageBox::Discard);
if(ret==QMessageBox::Save)
{
returnsave();
}
elseif(ret==QMessageBox::Cancel)
{
returnfalse;
}
returntrue;
}
/*
*關閉檔案事件
*/
voidMyChild::closeEvent(QCloseEvent*event)
{
if(maybeSave())
{
event->accept();
}
else
{
event->ignore();
}
}
/*
*檔案更改標籤
*編輯器內容是否被更改,可以使用QTextDocument類的isModified()函式獲知,這裡使用了QTextEdit類,document()函式來獲取
*它的QTextDocument類物件。然後使用setWindowModified()函式設定視窗的更改狀態標誌“*”,如果引數為true,則將在標題中設定
*了“[*]”號的地方顯示“*”號,表示該檔案已經被修改。
*/
voidMyChild::documentWasModified()
{
//根據文件的isModified()函式的返回值,判斷編譯器內容是否被更改
setWindowModified(document()->isModified());
}
QStringMyChild::userFriendlyCurrentFile()
{
returnstrippedName(curFile);
}
QStringMyChild::strippedName(constQString&fullFileName)
{
returnQFileInfo(fullFileName).fileName();
}
/*
*設定當前檔案屬性
*/
voidMyChild::setCurrentFile(constQString&fileName)
{
/*canonicalFilePath()可以除去路徑中符號連結,如“.”和“..”等符號。這個
*函式只是將載入檔案的路徑首先儲存到curFile中,然後再進行一些狀態的設定*/
curFile=QFileInfo(fileName).canonicalFilePath();
//檔案已經被儲存過
isUntitled=false;
//文件沒有被更改過
document()->setModified(false);
//視窗不顯示被更改標誌
setWindowModified(false);
//設定視窗標題,userFriendlyCurrentFile()返回檔名
setWindowTitle(userFriendlyCurrentFile()+"[*]");
}
/*
*設定字型格式
*呼叫QTextCursor的mergeCharFormat()函式,將引數format所表示的格式應用到游標所在處的字元上
*/
voidMyChild::mergeFormatOnWordOrSelection(constQTextCharFormat&format)
{
QTextCursorcursor=this->textCursor();
if(!cursor.hasSelection())
{
cursor.select(QTextCursor::WordUnderCursor);
}
cursor.mergeCharFormat(format);
this->mergeCurrentCharFormat(format);
}
/*
*設定段落對齊格式
*/
voidMyChild::setAlign(intalign)
{
if(align==1)
{
this->setAlignment(Qt::AlignLeft|Qt::AlignAbsolute);
}
elseif(align==2)
{
this->setAlignment(Qt::AlignHCenter);
}
elseif(align==3)
{
this->setAlignment(Qt::AlignRight|Qt::AlignAbsolute);
}
elseif(align==4)
{
this->setAlignment(Qt::AlignJustify);
}
}
voidMyChild::setStyle(intstyle)
{
//設定文字游標,執行文字首部
QTextCursorcursor=this->textCursor();
if(style!=0)
{
//QTextListFormat主要用於描述文字符號,編號的格式
QTextListFormat::Stylestylename=QTextListFormat::ListDisc;
switch(style)
{
default:
case1:
stylename=QTextListFormat::ListDisc;//實心圓標號
break;
case2:
stylename=QTextListFormat::ListCircle;//空心圓標號
break;
case3:
stylename=QTextListFormat::ListSquare;//方形標號
break;
case4:
stylename=QTextListFormat::ListDecimal;//十進位制標號
break;
case5:
stylename=QTextListFormat::ListLowerAlpha;//小寫字母編號
break;
case6:
stylename=QTextListFormat::ListUpperAlpha;//大寫字母編號
break;
case7:
stylename=QTextListFormat::ListLowerRoman;//小寫羅馬編號
break;
case8:
stylename=QTextListFormat::ListUpperRoman;//大寫羅馬編號
break;
}
//為支援撤銷操作(設定開始編輯文字格式)
cursor.beginEditBlock();
QTextBlockFormatbfmt=cursor.blockFormat();
QTextListFormatlistfmt;
if(cursor.currentList())
{
listfmt=cursor.currentList()->format();
}
else
{
listfmt.setIndent(bfmt.indent()+1);
bfmt.setIndent(0);
cursor.setBlockFormat(bfmt);
}
listfmt.setStyle(stylename);
cursor.createList(listfmt);
cursor.endEditBlock();
}
else
{
//QTextBlockFormatTextBlockFormat類則用於表示這一塊文字的格式,如縮排值、與四邊的邊距等
QTextBlockFormatbfmt;
bfmt.setObjectIndex(-1);
cursor.mergeBlockFormat(bfmt);//合併格式
}
}
myword.h
#ifndefMYWORD_H
#defineMYWORD_H
#include<QMainWindow>
#include<QPrintDialog>
#include<QPrinter>
#include<QPrintPreviewDialog>
classQMdiArea;//TextEdit
classQMenu;//主選單
classQAction;//動作
classQComboBox;//
classQFontComboBox;//
classMyChild;
classQMdiSubWindow;
classQSignalMapper;//訊號對映器,它可以實現對多個子視窗部件的相同訊號進行對映,首先為其新增字串或者數值引數,然後在傳送出去。
classMyword:publicQMainWindow
{
Q_OBJECT
public:
Myword(QWidget*parent=0);
~Myword();
private:
QMdiArea*mdiArea;
voidcreateMenus();//建立主選單
voidcreateActions();//建立動作
voidcreateToolBars();//建立工具欄
voidcreateStatusBar();//建立狀態列
voidcolorChanged(constQColor&c);//設定動作欄顏色
QMdiSubWindow*findMyChild(constQString&fileName);//查詢子視窗
voidenabledText();//設定格式選單及其對應的工具按鈕變為可用狀態
MyChild*activeMyChild();//活動視窗
QSignalMapper*windowMapper;
//選單
QMenu*fileMenu;//檔案選單
QMenu*editMenu;//編輯選單
QMenu*formatMenu;//格式選單
QMenu*fontMenu;//字型子選單
QMenu*alignMenu;//段落子選單
QMenu*windowMenu;//視窗選單
QMenu*helpMenu;//幫助選單
//【檔案】主選單
QAction*newAct;//新建
QAction*openAct;//開啟
QAction*saveAct;//儲存
QAction*saveAsAct;//另存為
QAction*printAct;//列印
QAction*printPreviewAct;//列印預覽
QAction*quitAct;//退出
//【編輯】主選單
QAction*undoAct;//撤銷
QAction*redoAct;//重做
QAction*cutAct;//剪下
QAction*copyAct;//複製
QAction*pasteAct;//貼上
//【格式】主選單
QAction*boldAct;//加粗
QAction*italicAct;//傾斜
QAction*underlineAct;//下劃線
QAction*leftAlignAct;//左對齊
QAction*centerAlignAct;//居中
QAction*rightAlignAct;//右對齊
QAction*justifyAct;//兩端對齊
QAction*colorAct;//顏色
//【視窗】主選單
QAction*closeAct;//關閉
QAction*closeAllAct;//關閉所有
QAction*tileAct;//平鋪
QAction*cascadeAct;//層疊
QAction*nextAct;//下一個
QAction*previousAct;//前一個
QAction*separatorAct;//
//【幫助】主選單
QAction*aboutAct;//關於本軟體
QAction*aboutQtAct;//關於Qt
QToolBar*fileToolBar;//"檔案"工具條
QToolBar*editToolBar;//"編輯"工具條
QToolBar*formatToolBar;//"格式"工具條
QToolBar*comboToolBar;//組合框選擇欄
QComboBox*comboStyle;//標號與編號型別選擇框
QFontComboBox*comboFont;//字型選擇框
QComboBox*comboSize;//字號選擇框
privateslots:
voidabout();
voidfileNew();//新建檔案操作
voidfileOpen();//開啟檔案操作
voidfileSave();//儲存檔案操作
voidfileSaveAs();//另存為檔案操作
voidundo();//撤銷
voidredo();//重做
voidcut();//剪下
voidcopy();//複製
voidpaste();//貼上
voidtextBold();//加粗
voidtextItalic();//傾斜
voidtextUnderline();//下劃線
voidtextFamily(constQString&f);//字型選擇框
voidtextSize(constQString&p);//字號
voidtextAlign(QAction*a);//設定段落對齊格式
voi