文章目录

  • 1 文本编辑器第一阶段测试

1 文本编辑器第一阶段测试


完成了第一阶段的代码编写后,我们可以进行简单的测试了。由于只是实现了界面,这里我们的测试更多的是关注有没有内存泄漏情况的发生。

我们需要借助Linux下的QT Creator环境进行测试,在分析下点击Vargrind的即可(如果没有安装需要自行安装)。

测试中发现如下几个地方会发生内存泄漏:

  1. QAction对象未指定父对象。
  2. QMenu对象未指定父对象。

    我们需要对代码进行修改,修改后的代码文件结构如下:

    MainWindow.h:
#ifndef _MAINWINDOW_H_
#define _MAINWINDOW_H_#include <QtGui/QMainWindow>
#include <QKeySequence>
#include <QMenuBar>
#include <QToolBar>
#include <QAction>
#include <QPlainTextEdit>
#include <QLabel>class MainWindow : public QMainWindow
{Q_OBJECTprivate:QPlainTextEdit mainEditor;QLabel statusLbl;MainWindow();MainWindow(const MainWindow&);MainWindow& operator= (const MainWindow&);bool construct();bool initMenuBar();bool initToolBar();bool initStatusBar();bool initMainEditor();bool initFileMenu(QMenuBar* mb);bool initEditMenu(QMenuBar* mb);bool initFormatMenu(QMenuBar* mb);bool initViewMenu(QMenuBar* mb);bool initHelpMenu(QMenuBar* mb);bool initFileToolItem(QToolBar* tb);bool initEditToolItem(QToolBar* tb);bool initFormatToolItem(QToolBar* tb);bool initViewToolItem(QToolBar* tb);bool makeAction(QAction*& action, QWidget* parent, QString text, int key);bool makeAction(QAction*& action, QWidget* parent, QString tip, QString icon);
public:static MainWindow* NewInstance();~MainWindow();
};#endif // _MAINWINDOW_H_

MainWindow.cpp:

#include "MainWindow.h"
#include <QMenu>
#include <QIcon>
#include <QSize>
#include <QStatusBar>
#include <QLabel>
#include <QDebug>MainWindow::MainWindow()
{}MainWindow* MainWindow::NewInstance()
{MainWindow* ret = new MainWindow();if( (ret == NULL) || !ret->construct() ){delete ret;ret = NULL;}return ret;
}bool MainWindow::construct()
{bool ret = true;ret = ret && initMenuBar();ret = ret && initToolBar();ret = ret && initStatusBar();ret = ret && initMainEditor();return ret;
}bool MainWindow::initMenuBar()
{bool ret = true;QMenuBar* mb = menuBar();ret = ret && initFileMenu(mb);ret = ret && initEditMenu(mb);ret = ret && initFormatMenu(mb);ret = ret && initViewMenu(mb);ret = ret && initHelpMenu(mb);return ret;
}bool MainWindow::initToolBar()
{bool ret = true;QToolBar* tb = addToolBar("Tool Bar");tb->setIconSize(QSize(16, 16));ret = ret && initFileToolItem(tb);tb->addSeparator();ret = ret && initEditToolItem(tb);tb->addSeparator();ret = ret && initFormatToolItem(tb);tb->addSeparator();ret = ret && initViewToolItem(tb);return ret;
}bool MainWindow::initStatusBar()
{bool ret = true;QStatusBar* sb = statusBar();QLabel* label = new QLabel("D.T.Software");if( label != NULL ){statusLbl.setMinimumWidth(200);statusLbl.setAlignment(Qt::AlignCenter);statusLbl.setText("Ln: 1    Col: 1");label->setMinimumWidth(200);label->setAlignment(Qt::AlignCenter);sb->addPermanentWidget(new QLabel());sb->addPermanentWidget(&statusLbl);sb->addPermanentWidget(label);}else{ret = false;}return ret;
}bool MainWindow::initMainEditor()
{bool ret = true;mainEditor.setParent(this);setCentralWidget(&mainEditor);return ret;
}bool MainWindow::initFileMenu(QMenuBar* mb)
{QMenu* menu = new QMenu("File(&F)", mb);bool ret = (menu != NULL);if( ret ){QAction* action = NULL;ret = ret && makeAction(action, menu, "New(&N)", Qt::CTRL + Qt::Key_N);if( ret ){menu->addAction(action);}ret = ret && makeAction(action, menu, "Open(&O)...", Qt::CTRL + Qt::Key_O);if( ret ){menu->addAction(action);}ret = ret && makeAction(action, menu, "Save(&S)", Qt::CTRL + Qt::Key_S);if( ret ){menu->addAction(action);}ret = ret && makeAction(action, menu, "Save As(&A)...", 0);if( ret ){menu->addAction(action);}menu->addSeparator();ret = ret && makeAction(action, menu, "Print(&P)...", Qt::CTRL + Qt::Key_P);if( ret ){menu->addAction(action);}menu->addSeparator();ret = ret && makeAction(action, menu, "Exit(&X)", 0);if( ret ){menu->addAction(action);}}if( ret ){mb->addMenu(menu);}else{delete menu;}return ret;
}bool MainWindow::initEditMenu(QMenuBar* mb)
{QMenu* menu = new QMenu("Edit(&E)", mb);bool ret = (menu != NULL);if( ret ){QAction* action = NULL;ret = ret && makeAction(action, menu, "Undo(&U)", Qt::CTRL + Qt::Key_Z);if( ret ){menu->addAction(action);}ret = ret && makeAction(action, menu, "Redo(&R)...", Qt::CTRL + Qt::Key_Y);if( ret ){menu->addAction(action);}menu->addSeparator();ret = ret && makeAction(action, menu, "Cut(&T)", Qt::CTRL + Qt::Key_X);if( ret ){menu->addAction(action);}ret = ret && makeAction(action, menu, "Copy(&C)...", Qt::CTRL + Qt::Key_C);if( ret ){menu->addAction(action);}ret = ret && makeAction(action, menu, "Paste(&P)...", Qt::CTRL + Qt::Key_V);if( ret ){menu->addAction(action);}ret = ret && makeAction(action, menu, "Delete(&L)", Qt::Key_Delete);if( ret ){menu->addAction(action);}menu->addSeparator();ret = ret && makeAction(action, menu, "Find(&F)...", Qt::CTRL + Qt::Key_F);if( ret ){menu->addAction(action);}ret = ret && makeAction(action, menu, "Replace(&R)...", Qt::CTRL + Qt::Key_H);if( ret ){menu->addAction(action);}ret = ret && makeAction(action, menu, "Goto(&G)...", Qt::CTRL + Qt::Key_G);if( ret ){menu->addAction(action);}menu->addSeparator();ret = ret && makeAction(action, menu, "Select All(&A)", Qt::CTRL + Qt::Key_A);if( ret ){menu->addAction(action);}}if( ret ){mb->addMenu(menu);}else{delete menu;}return ret;
}bool MainWindow::initFormatMenu(QMenuBar* mb)
{QMenu* menu = new QMenu("Format(&O)", mb);bool ret = (menu != NULL);if( ret ){QAction* action = NULL;ret = ret && makeAction(action, menu, "Auto Wrap(&W)", 0);if( ret ){menu->addAction(action);}ret = ret && makeAction(action, menu, "Font(&F)...", 0);if( ret ){menu->addAction(action);}}if( ret ){mb->addMenu(menu);}else{delete menu;}return ret;
}bool MainWindow::initViewMenu(QMenuBar* mb)
{QMenu* menu = new QMenu("View(&V)", mb);bool ret = (menu != NULL);if( ret ){QAction* action = NULL;ret = ret && makeAction(action, menu, "Tool Bar(&T)", 0);if( ret ){menu->addAction(action);}ret = ret && makeAction(action, menu, "Status Bar(&S)", 0);if( ret ){menu->addAction(action);}}if( ret ){mb->addMenu(menu);}else{delete menu;}return ret;
}bool MainWindow::initHelpMenu(QMenuBar* mb)
{QMenu* menu = new QMenu("Help(&H)", mb);bool ret = (menu != NULL);if( ret ){QAction* action = NULL;ret = ret && makeAction(action, menu, "User Manual", 0);if( ret ){menu->addAction(action);}ret = ret && makeAction(action, menu, "About NotePad...", 0);if( ret ){menu->addAction(action);}}if( ret ){mb->addMenu(menu);}else{delete menu;}return ret;
}bool MainWindow::initFileToolItem(QToolBar* tb)
{bool ret = true;QAction* action = NULL;ret = ret && makeAction(action, tb, "New", ":/res/pic/new.png");if( ret ){tb->addAction(action);}ret = ret && makeAction(action, tb, "Open", ":/res/pic/open.png");if( ret ){tb->addAction(action);}ret = ret && makeAction(action, tb, "Save", ":/res/pic/save.png");if( ret ){tb->addAction(action);}ret = ret && makeAction(action, tb, "Save As", ":/res/pic/saveas.png");if( ret ){tb->addAction(action);}ret = ret && makeAction(action, tb, "Print", ":/res/pic/print.png");if( ret ){tb->addAction(action);}return ret;
}bool MainWindow::initEditToolItem(QToolBar* tb)
{bool ret = true;QAction* action = NULL;ret = ret && makeAction(action, tb, "Undo", ":/res/pic/undo.png");if( ret ){tb->addAction(action);}ret = ret && makeAction(action, tb, "Redo", ":/res/pic/redo.png");if( ret ){tb->addAction(action);}ret = ret && makeAction(action, tb, "Cut", ":/res/pic/cut.png");if( ret ){tb->addAction(action);}ret = ret && makeAction(action, tb, "Copy", ":/res/pic/copy.png");if( ret ){tb->addAction(action);}ret = ret && makeAction(action, tb, "Paste", ":/res/pic/paste.png");if( ret ){tb->addAction(action);}ret = ret && makeAction(action, tb, "Find", ":/res/pic/find.png");if( ret ){tb->addAction(action);}ret = ret && makeAction(action, tb, "Replace", ":/res/pic/replace.png");if( ret ){tb->addAction(action);}ret = ret && makeAction(action, tb, "Goto", ":/res/pic/goto.png");if( ret ){tb->addAction(action);}return ret;
}bool MainWindow::initFormatToolItem(QToolBar* tb)
{bool ret = true;QAction* action = NULL;ret = ret && makeAction(action, tb, "Auto Wrap", ":/res/pic/wrap.png");if( ret ){tb->addAction(action);}ret = ret && makeAction(action, tb, "Font", ":/res/pic/font.png");if( ret ){tb->addAction(action);}return ret;
}bool MainWindow::initViewToolItem(QToolBar* tb)
{bool ret = true;QAction* action = NULL;ret = ret && makeAction(action, tb, "Tool Bar", ":/res/pic/tool.png");if( ret ){tb->addAction(action);}ret = ret && makeAction(action, tb, "Status Bar", ":/res/pic/status.png");if( ret ){tb->addAction(action);}return ret;
}bool MainWindow::makeAction(QAction*& action, QWidget* parent, QString text, int key)
{bool ret = true;action = new QAction(text, parent);if( action != NULL ){action->setShortcut(QKeySequence(key));}else{ret = false;}return ret;
}bool MainWindow::makeAction(QAction*& action, QWidget* parent, QString tip, QString icon)
{bool ret = true;action = new QAction("", parent);if( action != NULL ){action->setToolTip(tip);action->setIcon(QIcon(icon));}else{ret = false;}return ret;
}MainWindow::~MainWindow()
{}

main.cpp:

#include <QtGui/QApplication>
#include "MainWindow.h"int main(int argc, char *argv[])
{QApplication a(argc, argv);MainWindow* w = MainWindow::NewInstance();int ret = -1;if( w != NULL ){w->show();ret = a.exec();}delete w;return ret;
}

参考资料:

  1. QT实验分析教程

文本编辑器第一阶段测试相关推荐

  1. Visa发起区块链B2B支付第一阶段测试

    点击上方"蓝色字"可关注我们! 暴走时评:日前,全球信用卡巨头Visa于去年宣布开展的基于区块链的B2B支付服务--B2B Connect项目进入了首期试点阶段,该项目旨在促进机构 ...

  2. 计算机组成原理第一阶段测试,计算机组成原理随堂测验1附答案

    <计算机组成原理随堂测验1附答案>由会员分享,可在线阅读,更多相关<计算机组成原理随堂测验1附答案(2页珍藏版)>请在人人文库网上搜索. 1.A B C D5.是AC6.ABC ...

  3. Gbase8a第一阶段测试-试题整理

    1.GBase 8a集群数据库安装成功后,数据库的初始管理员为root,密码为空.( 正确) 正确 2.有关gcluster_services all stop命令,描述正确的是(B )? A. 关闭 ...

  4. 测试网节点公开部署第一阶段,全网筛选出21个优质节点

    自11月30日起,我们开启了测试网Gladios的第一阶段,对外开放节点的部署.一时间,Ares Protocol 全球社区积极响应. 活动期间,共筛选出21个优质节点.他们根据操作指南成功地接入,并 ...

  5. 基于AvalonEdit和prism的文本编辑器_AvalonEdit

    AvalonEdit_文本编辑器 基于AvalonEdit和prism的文本编辑器 第一步:导入AvalonEdit包 第二步:编辑AvalonEditBehaviour 我们可以通过 TextEdi ...

  6. 2023年认证杯SPSSPRO杯数学建模B题(第一阶段)考订文本全过程文档及程序

    2023年认证杯SPSSPRO杯数学建模 B题 考订文本 原题再现:   古代文本在传抄过程中,往往会出现种种错误,以至于一部书可能流传下来多种版本.在文献学中,错误往往被总结成"讹&quo ...

  7. 第一篇 群雄并起——文本编辑器的武林大会

    文本文件,是很重要的一种文件类型,它有很多优势,最重要的是它很小.在日常的学习与工作中,每个人都会或多或少要接触文本文件,这样,对文本文件进行编辑就是很平常的事情了.现在文本编辑器可谓种类繁多,鱼龙混 ...

  8. 中欧校友社区测试第一阶段之总结

    中欧校友社区8月5号上线,到今天运行了三天时间.之所以现在写总结,是因为之前设立的第一阶段目标(50人注册)已经达到.截至昨日晚10点,已有51位中欧校友注册.封闭式社区,网址我就不贴出来了. 观察如 ...

  9. 【渗透测试】--- FCKeditor文本编辑器漏洞

    FCKeditor编辑器漏洞 FCKeditor编辑器是一款强大的所见即所得文本编辑器,现在已经更名为:CKEditor 一.fckeditor的常见敏感目录(FCK有时要小写) (1) 查看版本信息 ...

最新文章

  1. 切记!MySQL中ORDER BY与LIMIT 不要一起用,有大坑
  2. js事件详解二:鼠标和滚轮事件
  3. Linux并发与同步专题 (1)原子操作和内存屏障
  4. HDU4321(位运算二进制1的统计)
  5. 我来说说java的NIO
  6. Python——装饰器的学习笔记
  7. sourceTree把当前分支合并到远程分支
  8. java 封闭类型_java – 如何获取封闭类?
  9. uni-app 变量赋值后被实时同步
  10. STM32国产替代,再来一波
  11. Java飞机小游戏代码详解
  12. 设计一个学生类Student
  13. Windows11 安装教程(ultraiso制作启动盘)
  14. 搜狐网络评论系统–畅言!与多说、友言、灯鹭、新浪评论简单评测
  15. 中缀表达式/后缀表达式/前缀表达式
  16. SqlServer日期格式
  17. python画图为什么运行不出来_python matplotlib画的图怎么显示不出来
  18. python保存网页截图
  19. 前端开发面试中常常问到的问题
  20. Git 从远程库克隆

热门文章

  1. 1.4 通过时间的反向传播-深度学习第五课《序列模型》-Stanford吴恩达教授
  2. 【童心制物】一篇很硬的标新立异级别的体验测评——聊新版造物编程盒
  3. 13.MATLAB的while、for、break、continue循环操作
  4. 基于FPGA的AES加解密读写控制系统,实现FLASH内部读写内容的销毁功能
  5. STM32的ISP升级详解
  6. 京瓷打印机几个常见密码
  7. HTML5本地存储——Web SQL Database
  8. 探秘Tomcat——一个简易的Servlet容器
  9. JavaScript(15)jQuery 选择器
  10. 对Struts2的认识(-)