qidao123.com ToB IT社区-企服评测·应用市场

 找回密码
 立即注册

Qt项目——文本编辑器(功能模块②)

[复制链接]
发表于 2026-2-14 19:33:34 | 显示全部楼层 |阅读模式
项目所在:GitHub - Outlier9/CatEditor: Cat文本编辑器--Qt
  有资助的话各位点点 star 啦,感谢!
  如果有必要学习该项目的人,以为看文档较为困难,可以加我接洽方式,给github点个star后可免费提供学习视频!!!
  (4)各种功能添加槽函数

在.ui文件的各个Action选项右击选择转到槽,选择triggered信号,调用对应的方法(均已封装好,可以直接调用)
这里有新建、关闭、关闭全部、平铺、层叠、下一个、上一个
  1. void MainWindow::on_newAction_triggered()
  2. {
  3.     docNew();
  4. }
  5. void MainWindow::on_closeAction_triggered()
  6. {
  7.     ui->mdiArea->closeActiveSubWindow();
  8. }
  9. void MainWindow::on_closeAllAction_triggered()
  10. {
  11.     ui->mdiArea->closeAllSubWindows();
  12. }
  13. void MainWindow::on_tileAction_triggered()
  14. {
  15.     ui->mdiArea->tileSubWindows();
  16. }
  17. void MainWindow::on_cascadeAction_triggered()
  18. {
  19.     ui->mdiArea->cascadeSubWindows();
  20. }
  21. void MainWindow::on_nextAction_triggered()
  22. {
  23.     ui->mdiArea->activateNextSubWindow();
  24. }
  25. void MainWindow::on_previousAction_triggered()
  26. {
  27.     ui->mdiArea->activatePreviousSubWindow();
  28. }
复制代码
但是在关闭窗口的时间,必要处置惩罚窗口关闭前的清算工作或处置惩罚用户的关闭哀求,以防数据丢失,判断是否有未生存或正在举行中的窗口,以是在头文件中声明变乱处置惩罚函数
  1. void MainWindow::closeEvent(QCloseEvent *event)
  2. {
  3.     ui->mdiArea->closeAllSubWindows();
  4.     //防止在关闭主窗口时意外丢失未保存的数据
  5.     if(ui->mdiArea->currentSubWindow())
  6.         event->ignore();  //如果存在当前活动的子窗口,忽略关闭事件。这意味着窗口不会关闭,用户可以继续操作
  7.     else
  8.         event->accept(); //接受此事件
  9. }
复制代码
(5)打开文档

在.ui界面临openAction转到槽,选triggered信号,然后和新建文档一样,我们将打开操纵举行封装,定名为docOpen
加载文件的时间有大概乐成也大概失败,以是这里必要一个验证
  1. bool loadDoc(const QString& docName); //加载文档验证
  2. void setCurDoc(const QString& docName);//设置当前文档路径及相关状态
复制代码
  1. //加载指定名称的文档
  2. bool ChileWnd::loadDoc(const QString &docName)
  3. {
  4.     if(!docName.isEmpty())
  5.     {
  6.         QFile file(docName);
  7.         if(!file.exists()) //文件是否存在
  8.             return false;
  9.         if(!file.open(QFile::ReadOnly)) // 打开文档并检查是否只读
  10.             return false;               //如果文件不能以只读方式打开
  11.         QByteArray text = file.readAll(); //读取文件内容
  12.         if(Qt::mightBeRichText(text)) // 是否是富文本类型并设置文本内容
  13.             setHtml(text);
  14.         else
  15.             setPlainText(text); //设置为纯文本
  16.         setCurDoc(docName); //设置当前文档路径
  17.         connect(document(),SIGNAL(contentsChanged()),this,SLOT(docBeModified()));
  18.         return true;
  19.     }
  20. }
  21. //设置当前文档路径及相关状态
  22. void ChileWnd::setCurDoc(const QString &docName)
  23. {
  24.     //返回标准名称路径,可以过滤“.”和“..”
  25.     m_CurDocPath = QFileInfo(docName).canonicalFilePath();
  26.     m_bSaved = true;                            //文档已被保存
  27.     document()->setModified(false);             //文档未被改动
  28.     setWindowModified(false);                   //窗口不显示改动标识
  29.     setWindowTitle(getCurDocName() + "[*]");    //设置子窗口标题
  30. }
复制代码
  1. public:
  2.     void docOpen();
  3. private:
  4. //匹配子窗口是否存在
  5. QMdiSubWindow* findChileWnd(const QString &docName);
复制代码
  1. void MainWindow::docOpen()
  2. {
  3.     QString docName = QFileDialog::getOpenFileName(this,
  4.                                      "打开文档",
  5.                                      "",
  6.                                      "文本文件(*.txt);;"
  7.                                      "HTML文件(*.html *.htm);;"
  8.                                      "所有文件(*.*)");
  9.     //如果用户选择了文件并且文件名不为空,则继续执行
  10.     if(!docName.isEmpty())
  11.     {
  12.         //查找是否已经有窗口打开了这个文档。如果找到已经存在的窗口,则将其激活,并返回
  13.         QMdiSubWindow *existWnd = findChileWnd(docName);
  14.         if(existWnd)
  15.         {
  16.             ui->mdiArea->setActiveSubWindow(existWnd);
  17.             return;
  18.         }
  19.         //如果文档尚未被打开,创建一个新的 ChileWnd 子窗口,并将其添加到 QMdiArea 中
  20.         ChileWnd *childWnd = new ChileWnd;
  21.         ui->mdiArea->addSubWindow(childWnd);
  22.         //连接子窗口的信号和主窗口的槽
  23.         connect(childWnd,SIGNAL(copyAvailable(bool)),
  24.                 ui->cutAction,SLOT(setEnabled(bool)));
  25.         connect(childWnd,SIGNAL(copyAvailable(bool)),
  26.                 ui->copyAction,SLOT(setEnabled(bool)));
  27.         //加载文档内容
  28.         if(childWnd->loadDoc(docName))
  29.         {
  30.             //显示状态栏信息 "文档已打开" 持续 3 秒
  31.             statusBar()->showMessage("文档已打开",3000);
  32.             childWnd->show();
  33.             formatEnable();
  34.         }
  35.         else
  36.         {
  37.             //加载失败,则关闭创建的子窗口
  38.             childWnd->close();
  39.         }
  40.     }
  41. }
  42. //匹配子窗口是否存在
  43. QMdiSubWindow *MainWindow::findChileWnd(const QString &docName)
  44. {
  45.     //获取文件的标准路径
  46.     QString strFile = QFileInfo(docName).canonicalFilePath();
  47.     //遍历所有子窗口
  48.     foreach(QMdiSubWindow* subWnd,ui->mdiArea->subWindowList()){
  49.         //转换子窗口的 widget 为 ChileWnd
  50.         ChileWnd* childWnd = qobject_cast<ChileWnd*>(subWnd->widget());
  51.         //比较子窗口的当前文档路径
  52.         if(childWnd->m_CurDocPath == strFile)
  53.             //如果相同,表示找到了对应的子窗口,返回该子窗口指针 subWnd
  54.             return subWnd;
  55.     }
  56.     //未找到对应子窗口的情况
  57.     return 0;
  58. }
复制代码
(6)生存/另存为文档

在.ui界面临saveAction和saveOther转到槽,选triggered信号,然后和新建文档一样,我们将两种生存操纵举行封装,定名为docSave和docSaveAs
  1. bool saveDoc(); //保存文档
  2. bool saveAsDoc(); //另存为
  3. bool saveDocOpt(QString docName); //保存文件的操作逻辑
复制代码
  1. //保存文档
  2. bool ChileWnd::saveDoc()
  3. {
  4.     //查询文档当前是否保存的状态(全局变量)
  5.     if(m_bSaved)
  6.         return saveDocOpt(m_CurDocPath);
  7.     else
  8.         saveAsDoc();
  9. }
  10. //另存为
  11. bool ChileWnd::saveAsDoc()
  12. {
  13.     QString docName = QFileDialog::getSaveFileName(this,
  14.                                  "另存为",
  15.                                  "文档.txt", // 默认保存为 txt 格式
  16.                                  "文本文件(*.txt);;"
  17.                                  "HTML文件(*.html *.htm);;"
  18.                                  "Word文件(*.doc *.docx);;"
  19.                                  "PDF文件(*.pdf);;"
  20.                                  "图片文件(*.png *.jpg *.jpeg *.bmp);;"
  21.                                  "所有文件(*.*)");
  22.     if(docName.isEmpty())
  23.         return false;
  24.     else
  25.         return saveDocOpt(docName);
  26. }
  27. //保存文件的操作逻辑
  28. bool ChileWnd::saveDocOpt(QString docName)
  29. {
  30.     //CaseInsensitive大小写都可以
  31.     if( !(docName.endsWith(".htm",Qt::CaseInsensitive)||
  32.                         docName.endsWith(".html",Qt::CaseInsensitive)))
  33.     {
  34.         //如果没有后缀就添加
  35.         docName += ".html";
  36.     }
  37.     ////创建一个 QTextDocumentWriter 对象 writer,用于写入文档
  38.     QTextDocumentWriter writer(docName);
  39.     bool isSuccess = writer.write(this->document());
  40.     //如果成功写入,就设置文档名字
  41.     if(isSuccess)
  42.     {
  43.         setCurDoc(docName);
  44.     }
  45.     return isSuccess;
  46. }
复制代码
  1. void docSave();
  2. void docSaveAs();
复制代码
  1. //保存
  2. void MainWindow::docSave()
  3. {
  4.     //如果该活动窗口存在且它的saveDoc返回值为true也就是保存成功
  5.     if(activateChildWnd() && activateChildWnd()->saveDoc())
  6.     {
  7.         statusBar()->showMessage("保存成功",3000);
  8.     }
  9. }
  10. //另存为
  11. void MainWindow::docSaveAs()
  12. {
  13.     //如果该活动窗口存在且它的saveDoc返回值为true也就是保存成功
  14.     if(activateChildWnd() && activateChildWnd()->saveAsDoc())
  15.     {
  16.         statusBar()->showMessage("保存成功",3000);
  17.     }
  18. }
  19. //Action转到槽
  20. void MainWindow::on_saveAction_triggered()
  21. {
  22.     docSave();
  23. }
  24. void MainWindow::on_saveOther_triggered()
  25. {
  26.     docSaveAs();
  27. }
复制代码
在关闭文档的时间,如果文档此时的状态是被修改且未生存,就出现一个提示并可以选择生存,在子类中实现该方法promptSave,然后添加关闭变乱处置惩罚
  1. protected:
  2.     void closeEvent(QCloseEvent *event); //关闭事件发生时,进行未保存该文档提示
  3. private:
  4.     bool promptSave(); //提示未保存但是要关闭的时候进行保存
复制代码
  1. void ChileWnd::closeEvent(QCloseEvent *event)
  2. {
  3.     if(promptSave())
  4.         event->accept();
  5.     else
  6.         event->ignore();
  7. }
  8. //提示未保存但是要关闭的时候进行保存
  9. bool ChileWnd::promptSave()
  10. {
  11.     if(!document()->isModified())
  12.         return true;
  13.     //提示消息框
  14.     QMessageBox::StandardButton result;
  15.     result = QMessageBox::warning(this,
  16.                                   QString("系统提示"),
  17.                                   QString("文档%1已修改,是否保存?")
  18.                                   .arg(getCurDocName()),
  19.                                   QMessageBox::Yes | QMessageBox::Discard | QMessageBox::Cancel);
  20.     if(result == QMessageBox::Yes)
  21.         return saveDoc();
  22.     else if(result == QMessageBox::Cancel)
  23.         return false;
  24.     return true;
  25.     if(!document()->isModified())
  26.         return true;
  27. }
复制代码
现在点击打开和生存就已经收效了 


免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!qidao123.com:ToB企服之家,中国第一个企服评测及软件市场,开放入驻,技术点评得现金

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

×
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

登录后关闭弹窗

登录参与点评抽奖  加入IT实名职场社区
去登录

QQ|手机版|qidao123.com IT社区;IT企服评测▪应用市场 ( 浙ICP备20004199|浙ICP备20004199号 )|网站地图

GMT+8, 2026-3-11 11:43 , Processed in 0.194872 second(s), 32 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2026 Discuz! Team.

快速回复 返回顶部 返回列表