基于Qt实现的简易记事本

WhiteInterweaves

发布日期: 2021-03-08 10:40:23 浏览量: 578
评分:
star star star star star star star star star star_border
*转载请注明来自write-bug.com

一、实验内容

使用 Qt 设计并实现简易记事本。记事本包括一个 Menu,三个 Toolbar 和一 个文本编辑区。

  • Menu 主要包含四个下拉列表:File, Edit, Format 和 Help

  • File 下拉列表包含: New(新建), Open(打开), Save(保存), Save As(另存), Print(打印), Print Preview(打印预览)和 Exit(退出)

  • Edit 下拉列表包含:Undo(撤销), Redo (重做), Cut(剪切), Copy(复制), Paste(粘贴)

  • Format 下拉列表包含: Font(字体)子列表和 Color(颜色),Font(字体)子列表里包含 Bold(加粗), Italic(斜体)和 Underline(下划线)

  • Help 下拉列表包含:About(关于)和 About Qt(关于 Qt)。Toolbar 包含 fileToolBar, editToolBar 和 formatToolBar

二、代码结构

实现过程中没有添加新的类,所有功能都在 MainWindow 主类中实现。添加的属性和方法如表 1 所示:

三、算法介绍

本次实验没有设计到较为复杂的算法,都是使用 Qt 自带的一些类,以及相关类对应的方法来实现对应的功能。主要用到以下几个类及其方法:

QPlainTextEdit 类:本实验文本编辑域类,主要用来实现文本编辑中用户需要的各种功能需求。

QMenuBar 类:主要用来实现菜单栏功能。

QMenu 类:主要用来实现菜单栏每个菜单的功能,包括 File,Edit,Format 和 Help,以 Format 菜单为例,实现代码如下:

  1. menuFormat = menuBar->addMenu(tr("&Format"));
  2. menuFormat->addSeparator();
  3. menuFont = menuFormat->addMenu(tr("&Font"));
  4. menuFont->addAction(boldAct);
  5. menuFont->addAction(italicAct);
  6. menuFont->addAction(underlineAct);
  7. menuFormat->addAction(colorAct);

用到的方法及其功能见表 3-3:

QAction 类:主要用来实现每个菜单中的 Action,以 File 菜单下的 New(新建)为例,代码实现如下:

  1. newAct = new QAction(QIcon("icons/new.png"),tr("&New"), this);
  2. newAct->setShortcut(QKeySequence(tr("Ctrl+N")));
  3. newAct->setToolTip("New");
  4. newAct->setStatusTip(tr("Create a new file"));
  5. connect(newAct, SIGNAL(triggered()), this, SLOT(newFile()));

用到的方法及其功能见表 3-4:

QTextcharFormat 类,主要用来设置 textEdit 中的字体的样式,以初始默认样式为例,代码实现如下:

  1. void TextEdit::initialize() {
  2. QTextCharFormat fmt;
  3. fmt.setFontPointSize(15);
  4. fmt.setFontFamily("Times New Roman");
  5. textEdit->mergeCurrentCharFormat(fmt);
  6. }

用到的方法及其功能见表 3-5。

四、UML 图

用例图如图 4-1 所示,为用户提供的功能主要是菜单栏中的几个菜单。包括文本编辑,File 菜单中的新建,打开,保存,另存为,打印,预览和退出。Edit 菜单中的撤销,重做,剪切,复制,粘贴。Format 菜单中的加粗,斜体,下划线和颜色设置。Help 菜单中的关于和关于 Qt。

类图如图 4-2 所示。

五、信号和槽

5.1 信号与槽函数的连接

File Menu 中的 connect

  1. connect(newAct, SIGNAL(triggered()), this, SLOT(newFile()));
  2. connect(openAct, SIGNAL(triggered()), this, SLOT(openFile()));
  3. connect(saveAct, SIGNAL(triggered()), this, SLOT(saveFile()));
  4. connect(saveAsAct, SIGNAL(triggered()), this, SLOT(saveAsFile()));
  5. connect(printAct, SIGNAL(triggered()), this, SLOT(printFile()));
  6. connect(printPreviewAct, SIGNAL(triggered()), this, SLOT(printPreview()));
  7. connect(exitAct, SIGNAL(triggered()), this, SLOT(exit()));

Eidt Menu 中的 connect

  1. connect(undoAct, SIGNAL(triggered()), this, SLOT(undo()));
  2. connect(redoAct, SIGNAL(triggered()), this, SLOT(redo()));
  3. connect(cutAct, SIGNAL(triggered()), this, SLOT(cut()));
  4. connect(copyAct, SIGNAL(triggered()), this, SLOT(copy()));
  5. connect(pasteAct, SIGNAL(triggered()), this, SLOT(paste()));

Format Menu 中的 connect

  1. connect(boldAct, SIGNAL(triggered()), this, SLOT(bold()));
  2. connect(italicAct, SIGNAL(triggered()), this, SLOT(italic()));
  3. connect(underlineAct, SIGNAL(triggered()), this, SLOT(underline()));
  4. connect(colorAct, SIGNAL(triggered()), this, SLOT(color()));

Help Menu 中的 connect

  1. connect(aboutAct, SIGNAL(triggered()), this, SLOT(about()));
  2. connect(aboutQtAct, SIGNAL(triggered()), qApp, SLOT(aboutQt()));

textEdit 中的 connect

  1. connect(textEdit, SIGNAL(textChanged()), this, SLOT(textChange()));
  2. connect(textEdit, SIGNAL(selectionChanged()), this, SLOT(selectChange()));

打印预览 connect

  1. connect(&preview, SIGNAL(paintRequested(QPrinter*)), this, SLOT(printPreviewSlot(QPrinter*)));

5.2 槽函数执行功能

六、实验亮点

6.1 点击窗口关闭按钮或者 exit

点击窗口关闭按钮或者 exit 时,若文档未保存,则跳出提示框,询问用户 是否保存。若文档已经保存,或者文档未进行修改则不会跳出提示框,直接关闭。

效果如图 6-1 所示。 具体实现方法如下:

  1. int TextEdit::exit() {
  2. if (!isSaved) {
  3. int signal = QMessageBox::warning(this, tr("Warning"), tr("Do you want to save the changes?"), QMessageBox::Save | QMessageBox::Discard | QMessageBox::Cancel, QMessageBox::Save);
  4. switch (signal) {
  5. case QMessageBox::Save:
  6. saveFile();
  7. break;
  8. case QMessageBox::Discard:
  9. return 0;
  10. QCoreApplication::exit(0);
  11. case QMessageBox::Cancel:
  12. break;
  13. }
  14. return 1;
  15. }
  16. return 0;
  17. }
  18. void TextEdit::closeEvent(QCloseEvent *event) {
  19. int res = exit();
  20. if (res) event->ignore();
  21. }

当点击了 exit action 之后,调用 exit()槽函数。判断当前文件是否已保存。若文件未保存,则弹出警告 QMessageBox 询问用户是否要保存当前文件,共有三个选择按钮:Save(保存当前文件),Discard(不保存,退出),Cancle(取消,返回当前文件)。

当点击了窗口的关闭按钮后,调用 closeEvent 函数,函数中调用 exit()函数,判断如果用户选择的是 Cancle,则取消关闭当前窗口。当文档进行修改后,如上文第五点中 textEdit 中的 connect,textEdit 文档发生修改会调用 textChange()槽函数,修改文件状态为保存即可。(修改 isSaved 值为 false)

6.2 加粗,斜体,下划线功能

加粗,斜体,下划线功能的实现效果完全仿照 Ofiice Word。ToolBar 中的加粗,斜体,下划线图标的状态(checked 状态或者非 checked 状态)完全取决于鼠标光标所处位置处的字体。如果是选中状态的话,取决于选中文本结尾处字体的格式。

光标所处位置处前一个字“国”为加粗状态。所以当前 B 图标为 checked 状态。I 图标和 U 图标为非 checked 状态。

光标所处位置处前一个字为“津”,该字此时为 normal 状态,所以三个图 标均为非 checked 状态。

具体实现方法代码如下:

  1. connect(textEdit, SIGNAL(selectionChanged()), this, SLOT(selectChange()));
  2. void TextEdit::selectChange() {
  3. QTextCharFormat fmt = textEdit->currentCharFormat();
  4. int weight = fmt.fontWeight();
  5. bool italic = fmt.fontItalic();
  6. bool underline = fmt.fontUnderline();
  7. if (weight == 75) boldAct->setChecked(true);
  8. else boldAct->setChecked(false);
  9. if (italic) italicAct->setChecked(true);
  10. else italicAct->setChecked(false);
  11. if (underline) underlineAct->setChecked(true);
  12. else underlineAct->setChecked(false);
  13. }

首先,当光标所处位置发生变化时,textEdit 会发出 selectionChanged() 信号,然后与之对应的槽函数 selectChange()进行接收。在该函数中,首先获取光标所处位置处文字的 format。然后根据这个 format 对“加粗”,“斜 体”,“下划线”的 checked 状态进行设置。只需要设置成对立状态就可以了。

七、总结讨论

经过本次实验,我对 Qt 的使用更为熟练。此次实验的所有控件都是通过代码实现的,所以是我使用 Qt 以来的一次新的尝试,之前使用 Qt 控件都是通过 Qt designer 完成的。较实验一而言,本次 实验更偏重的是对 Qt 一些新的类的了解与应用。比如 QMenu 类,QAction 类,QPrinter 类等。让我认识了很多 Qt 自带的新的类,更加体会到 Qt 的强大之处。更重要的是,对 C++语言更为熟悉,编程能力进一步加强。

上传的附件 cloud_download 基于Qt实现的简易记事本.7z ( 4.04mb, 8次下载 )
error_outline 下载需要10点积分

发送私信

别人早就看开的事情, 你只是比别人慢了点

11
文章数
14
评论数
最近文章
eject