多文档文本编辑器(Qt)
? ? ? 廢了一下午的時間,結合著課本終于把這個實例給弄出來了,中間錯誤百出,真是學習的過程賊痛苦。
? ? ? 原來寫過一篇java實現的多文檔編輯器,那個確實是自己寫的,界面及其難看,毫無健壯性,操作稍微錯一步就得崩,不過用這玩 意應付老師還可以的哈哈。
? ? ? 下面寫的是使用C++的Qt界面設計的一個多文本編輯器,界面好看了許多,而且操作起來不存在bug,功能上可能少一點,沒有添加顏色和字體功能,但是看著比較舒服,可以實現多文檔的平鋪和層疊,有一定的可操作性。還有我這個是使用Qt creator編輯器寫的,可以去Qt中文社區下載安裝,很簡單。
? ? ? 這是我的一個項目文件目錄,其中.ui文件是界面設計文件,Qt是所使用xml文件保存界面設計的代碼,和java有所區別。源文件的三個C++文件是具體的實現方法和子窗口實現方法。頭文件中定義和相關的函數。代碼挺多的大約四五百行左右,所以不太容易看懂,但是里面添加了許多的注釋,應該大致的調用結構可以看得懂,一些具體的方法就不用管了。
下面展示一下成果界面
? ? ? ?可以實現文件的打開,保存,多文檔平鋪和層疊,關閉,撤銷,復制,粘貼,剪切以及前一個和后一個文檔的切換,我覺得比較好的是細節做得還是挺好的,比如沒有打開文件的時候工具欄禁止操作,對文檔是否被修改進行*號標記,顯示文本的行號和列號信息,自動顯示滾動條,操作成功的信息提醒等一些細節上的實現。
? ? ? ? 下面代碼段是其中mdichild.cpp文件的源碼,主要是實現一些子窗口的功能,比如文件的打開和加載,文件的另存為等一些操作。
#include "mdichild.h" #include<QFile> #include<QTextStream> #include<QMessageBox> #include<QFileInfo> #include<QApplication> #include<QFileDialog> #include<QCloseEvent> #include<QPushButton> MdiChild::MdiChild(QWidget *parent) :QTextEdit(parent) {setAttribute(Qt::WA_DeleteOnClose);isUntitled = true;} //新建文件 void MdiChild::newFile() {static int sequenceNumber = 1;isUntitled = true;curFile = tr("未命名文檔%1.txt").arg(sequenceNumber++);setWindowTitle(curFile+"[*]"+tr("-多文檔編輯器"));connect(document(),SIGNAL(contentsChanged()),this,SLOT(documentWasModified()));} //文檔是否被修改 void MdiChild::documentWasModified() {setWindowModified(document()->isModified()); }void MdiChild::setCurrentFile(const QString &fileName) { //canonicalFilePath可以出去路徑中的符號curFile = QFileInfo(fileName).canonicalFilePath();//文件已經被保存過了isUntitled = false;//文檔沒有被更改document()->setModified(false);//窗口不顯示*號setWindowModified(false);//設置窗口標題,userFriendlyCurrentFile()返回文件名setWindowTitle(userFriendlyCurrentFile()+"[*]"); } //加載文件 bool MdiChild::loadFile(const QString &fileName) {QFile file(fileName);if(!file.open(QFile::ReadOnly|QFile::Text)){QMessageBox::warning(this,tr("多文檔編輯器"),tr("無法讀取文件%1:\n%2.").arg(fileName).arg(file.errorString()));return false;}//新建文本流對象QTextStream in(&file);//設置鼠標狀態為等待狀態QApplication::setOverrideCursor(Qt::WaitCursor);//讀取文件的全部內容,并添加到編輯器setPlainText(in.readAll());//恢復鼠標狀態QApplication::restoreOverrideCursor();//設置當前文件setCurrentFile(fileName);connect(document(),SIGNAL(contentsChanged()),this,SLOT(documentWasModified()));return true; }QString MdiChild::userFriendlyCurrentFile() {//從文件路徑提取文件名return QFileInfo(curFile).fileName(); }//保存操作 bool MdiChild::save() {//如果文件沒有被保存過,則執行另存為操作,否則直接保存文件if(isUntitled){return saveAs();}else {return saveFile(curFile);} }//另存為 bool MdiChild::saveAs() {QString fileName = QFileDialog::getSaveFileName(this,tr("另存為"),curFile);//獲取文件路徑,如果為空,則返回false,否則保存文件if(fileName.isEmpty()){return false;}else {return saveFile(fileName);} }bool MdiChild::saveFile(const QString &fileName) {QFile file(fileName);if(!file.open(QFile::WriteOnly|QFile::Text)){QMessageBox::warning(this,tr("多文檔編輯器"),tr("無法寫入文件%1::\n%2.").arg(fileName).arg(file.errorString()));return false;}QTextStream out(&file);QApplication::setOverrideCursor(Qt::WaitCursor);out<<toPlainText();QApplication::restoreOverrideCursor();setCurrentFile(fileName);return true; }//關閉操作 void MdiChild::colseEvent(QCloseEvent *event) {if(maybeSave()){event->accept();}else{event->ignore();} }bool MdiChild::maybeSave() {if(document()->isModified()){QMessageBox box;box.setWindowTitle(tr("多文檔編輯器"));box.setText(tr("是否保存對”%1“的修改").arg(userFriendlyCurrentFile()));box.setIcon(QMessageBox::Warning);QPushButton *yesBtn = box.addButton(tr("是"),QMessageBox::YesRole);box.addButton(tr("否"),QMessageBox::NoRole);QPushButton *cancelBtn = box.addButton(tr("取消"),QMessageBox::RejectRole);//彈出對話框,讓用戶選擇是否保存修改box.exec();if(box.clickedButton() == yesBtn){return save();}else if(box.clickedButton()==cancelBtn){return false;}}//如果沒有更改,直接返回truereturn true; }另外一個cpp文件的代碼較多就不貼了,而且中間圖片都是在項目文件夾之下,還要環境配置的問題,有代碼也不一定能運行,而且csdn很多資源都是半成品就傳了上去,深受其害。所以我把項目打包成了exe文件,加上一些配置文件可以在電腦上直接運行,省去了很多事。壓縮包里面包括可執行文件和項目所有的源文件。
附上下載鏈接:
https://download.csdn.net/download/cumtlz/10727791
?
總結
以上是生活随笔為你收集整理的多文档文本编辑器(Qt)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: adb需要安装java吗_jdk和adb
- 下一篇: 中文版php.ini