QT-利用C++仿制windown自带的记事本程序V1.0

  下班无事, 发现QT还是很好用的, 就仿制windows的记事本做了一个,未彻底DEBUG, 先拿来分享下.

windows记事本大概是这样的:

大概分为以下几步:

1. 界面用QT代码写,即可, QT的布局很强大

  1 //create all actions
  2 void Notepad::createActions()
  3 {
  4     newAct = new QAction(tr("新建(&N)"), this);
  5     openAct = new QAction(tr("打开(&O)"), this);
  6     saveAct = new QAction(tr("保存(&S)"), this);
  7     saveAsAct = new QAction(tr("另存为(&A)..."), this);
  8     pageSetupAct = new QAction(tr("页面设置(&U)..."), this);
  9     printAct = new QAction(tr("打印(&P)..."), this);
 10     quitAct = new QAction(tr("退出(&Q)"), this);
 11
 12     undoAct = new QAction(tr("撤消(&U)"), this);
 13     redoAct = new QAction(tr("重做(&R)"), this);
 14     cutAct = new QAction(tr("剪切(&T)"), this);
 15     copyAct = new QAction(tr("复制(&C)"), this);
 16     pasteAct = new QAction(tr("粘贴(&P)"), this);
 17     deleteAct = new QAction(tr("删除(&L)"), this);
 18     findAct = new QAction(tr("查找(&F)..."), this);
 19     findNextAct = new QAction(tr("查找下一个(&N)"), this);
 20     replaceAct = new QAction(tr("替换(&E)..."), this);
 21     gotoAct = new QAction(tr("转到(&G)..."), this);
 22     selectAllAct = new QAction(tr("全选(&A)"), this);
 23     timeAct = new QAction(tr("时间/日期(&D)"), this);
 24
 25     autoNewLineAct = new QAction(tr("自动换行(&L)"), this);
 26     fontAct = new QAction(tr("字体(&F)..."), this);
 27
 28     statusBarAct = new QAction(tr("状态栏(&S)"), this);
 29
 30     viewHelpAct = new QAction(tr("查看帮助(&H)"), this);
 31     aboutNotepadAct = new QAction(tr("关于记事本(&A)"), this);
 32 }
 33
 34 //create all munus
 35 void Notepad::createMenus()
 36 {
 37     fileMenu = this->menuBar()->addMenu(tr("文件(&F)"));
 38     editMenu = this->menuBar()->addMenu(tr("编辑(&E)"));
 39     formatMenu = this->menuBar()->addMenu(tr("格式(&O)"));
 40     viewMenu = this->menuBar()->addMenu(tr("查看(&V)"));
 41     helpMenu = this->menuBar()->addMenu(tr("帮助(&H)"));
 42 }
 43
 44 //create textEdit
 45 void Notepad::createOther()
 46 {
 47     clipboard = QApplication::clipboard();
 48     QWidget *widget = new QWidget;
 49     textEdit = new QTextEdit();
 50     textEdit->setAcceptRichText(false);
 51     //set font
 52     QFont font("Arial", 12);
 53     textEdit->setFont(font);
 54     updateScrollBar();
 55     updateTextEdit();
 56     QHBoxLayout *mainLayout = new QHBoxLayout;
 57     mainLayout->setMargin(0);//important
 58     mainLayout->addWidget(textEdit);
 59
 60     widget->setLayout(mainLayout);
 61     setCentralWidget(widget);
 62 }
 63
 64 //create all connectors
 65 void Notepad::createConnectors()
 66 {
 67     connect(textEdit, SIGNAL(undoAvailable(bool)), this, SLOT(updateUndoAct(bool)));
 68     connect(textEdit, SIGNAL(redoAvailable(bool)), this, SLOT(updateRedoAct(bool)));
 69     connect(textEdit, SIGNAL(copyAvailable(bool)), this, SLOT(updateCutAct(bool)));
 70     connect(textEdit, SIGNAL(copyAvailable(bool)), this, SLOT(updateCopyAct(bool)));
 71     connect(textEdit, SIGNAL(copyAvailable(bool)), this, SLOT(updateDeleteAct(bool)));
 72     connect(textEdit, SIGNAL(textChanged()), this, SLOT(updateFindGroupActs()));
 73     connect(textEdit, SIGNAL(textChanged()), this, SLOT(updateSelectAllAct()));
 74     connect(textEdit, SIGNAL(textChanged()), this, SLOT(updateRowCol()));
 75     connect(clipboard, SIGNAL(dataChanged()), this, SLOT(updatePasteAct()));
 76     connect(this, SIGNAL(saveSignal(bool)), this, SLOT(updateSaveAct(bool)));
 77     //new file
 78     connect(newAct, SIGNAL(triggered()), this, SLOT(newFile()));
 79     //open file
 80     connect(openAct, SIGNAL(triggered()), this, SLOT(openFile()));
 81     //save file
 82     connect(saveAct, SIGNAL(triggered()), this, SLOT(saveFile()));
 83     //save as file
 84     connect(saveAsAct, SIGNAL(triggered()), this, SLOT(saveAsFile()));
 85     //page setup
 86     connect(pageSetupAct, SIGNAL(triggered()), this, SLOT(pageSetup()));
 87     //print
 88     connect(printAct, SIGNAL(triggered()), this, SLOT(print()));
 89     //close
 90     connect(quitAct, SIGNAL(triggered()), this, SLOT(quit()));
 91
 92     //undo
 93     connect(undoAct, SIGNAL(triggered()), this, SLOT(undo()));
 94     //redo
 95     connect(redoAct, SIGNAL(triggered()), this, SLOT(redo()));
 96     //cut
 97     connect(cutAct, SIGNAL(triggered()), this, SLOT(cut()));
 98     //copy
 99     connect(copyAct, SIGNAL(triggered()), this, SLOT(copy()));
100     //paste
101     connect(pasteAct, SIGNAL(triggered()), this, SLOT(paste()));
102     //del
103     connect(deleteAct,SIGNAL(triggered()), this, SLOT(del()) );
104     //find dialog
105     connect(findAct, SIGNAL(triggered()), this, SLOT(findDialog()));
106     //find next
107     connect(findNextAct, SIGNAL(triggered()), this, SLOT(findNext()));
108     //replace dialog
109     connect(replaceAct, SIGNAL(triggered()), this, SLOT(replaceDialog()));
110     //go to dialog
111     connect(gotoAct, SIGNAL(triggered()), this, SLOT(gotoLine()));
112     //select all
113     connect(selectAllAct, SIGNAL(triggered()), this, SLOT(selectAll()));
114     //add date
115     connect(timeAct, SIGNAL(triggered()), this, SLOT(addTime()));
116     //auto new line
117     connect(autoNewLineAct, SIGNAL(triggered()), this, SLOT(autoNewLine()));
118     //font dlg
119     connect(fontAct, SIGNAL(triggered()), this, SLOT(fontDlg()));
120     //status bar
121     connect(statusBarAct, SIGNAL(triggered()), this, SLOT(myStatusBar()));
122     //view help
123     connect(viewHelpAct, SIGNAL(triggered()), this, SLOT(viewHelp()));
124     //about
125     connect(aboutNotepadAct, SIGNAL(triggered()), this, SLOT(about()));
126 }
127
128 //add all shortcuts
129 void Notepad::joinShortcuts()
130 {
131     newAct->setShortcut(QKeySequence::New);
132     openAct->setShortcut(QKeySequence::Open);
133     saveAct->setShortcut(QKeySequence::Save);
134     //saveAsAct->setShortcut(QKeySequence::SaveAs);
135     saveAsAct->setShortcut(QKeySequence(tr("Ctrl+Shift+S")));
136     pageSetupAct->setShortcut(QKeySequence(tr("Ctrl+E")));
137     printAct->setShortcut(QKeySequence::Print);
138     quitAct->setShortcut(QKeySequence(tr("Ctrl+Q")));
139     //quitAct->setShortcut(QKeySequence::Quit);
140
141     undoAct->setShortcut(QKeySequence::Undo);
142     redoAct->setShortcut(QKeySequence::Redo);
143     cutAct->setShortcut(QKeySequence::Cut);
144     copyAct->setShortcut(QKeySequence::Copy);
145     pasteAct->setShortcut(QKeySequence::Paste);
146     deleteAct->setShortcut(QKeySequence::Delete);
147     newAct->setShortcut(QKeySequence::New);
148
149     findAct->setShortcut(QKeySequence::Find);
150     findNextAct->setShortcut(QKeySequence::FindNext);
151     replaceAct->setShortcut(QKeySequence::Replace);
152
153     gotoAct->setShortcut(QKeySequence(tr("Ctrl+G")));
154     selectAllAct->setShortcut(QKeySequence::SelectAll);
155     timeAct->setShortcut(QKeySequence(tr("F5")));
156
157     viewHelpAct->setShortcut(QKeySequence::HelpContents);
158 }
159
160 //add all actions to menus
161 void Notepad::joinActions()
162 {
163     fileMenu->addAction(newAct);
164     fileMenu->addAction(openAct);
165     fileMenu->addAction(saveAct);
166     fileMenu->addAction(saveAsAct);
167     fileMenu->addSeparator();
168     fileMenu->addAction(pageSetupAct);
169     fileMenu->addAction(printAct);
170     fileMenu->addSeparator();
171     fileMenu->addAction(quitAct);
172
173     editMenu->addAction(undoAct);
174     editMenu->addAction(redoAct);
175     editMenu->addSeparator();
176     editMenu->addAction(cutAct);
177     editMenu->addAction(copyAct);
178     editMenu->addAction(pasteAct);
179     editMenu->addAction(deleteAct);
180     editMenu->addSeparator();
181     editMenu->addAction(findAct);
182     editMenu->addAction(findNextAct);
183     editMenu->addAction(replaceAct);
184     editMenu->addAction(gotoAct);
185     editMenu->addSeparator();
186     editMenu->addAction(selectAllAct);
187     editMenu->addAction(timeAct);
188
189     formatMenu->addAction(autoNewLineAct);
190     formatMenu->addAction(fontAct);
191
192     viewMenu->addAction(statusBarAct);
193
194     helpMenu->addAction(viewHelpAct);
195     helpMenu->addSeparator();
196     helpMenu->addAction(aboutNotepadAct);
197 }

2. 每个菜单的逻辑, 这个要设计以下, 不能一上来就写代码, 容易返工,最后乱成一团

3. 编写代码, 一项一项来, 就像机械3D建模一样, 按组件来建立

这个有点多了, 就列下头文件, 后面整理了代码,再传上来

  1 /*************************************
  2 **fileName: notepad.h
  3 **author: kakasi ([email protected])
  4 **version: v1.0
  5 **date: 2015-10-14
  6 **last edit date: 2015-10-24 by kakasi
  7 **************************************/
  8 #ifndef NOTEPAD_H
  9 #define NOTEPAD_H
 10 #include <QMainWindow>
 11 #include "common.h"
 12
 13 class QTextEdit;
 14 class QAction;
 15 class QMenu;
 16 class QClipboard;
 17 class QPrinter;
 18 class FindDialog;
 19 class ReplaceDialog;
 20 class GotoDialog;
 21 class QLabel;
 22 class Notepad : public QMainWindow
 23 {
 24     Q_OBJECT
 25 public:
 26     Notepad();
 27
 28 signals:
 29     void saveSignal(bool b);
 30
 31 private slots:
 32     //========update acts=======
 33     void updateUndoAct(bool b);
 34     void updateRedoAct(bool b);
 35     void updateCutAct(bool b);
 36     void updateCopyAct(bool b);
 37     void updateDeleteAct(bool b);
 38     void updatePasteAct();
 39     void updateSaveAct(bool b);
 40     void updateFindGroupActs();
 41     void updateSelectAllAct();
 42     void remberOldPosition();
 43     void printPreview(QPrinter *printer);
 44     //========actions=========
 45     void newFile();
 46     void openFile();
 47     bool saveFile();
 48     bool saveAsFile();
 49     void pageSetup();
 50     void print();
 51     void quit();
 52
 53     void undo();
 54     void redo();
 55     void cut();
 56     void copy();
 57     void paste();
 58     void del();
 59
 60     void findDialog();
 61     //find string
 62     void findString(FindData *findData);
 63     //find next
 64     void findNext();
 65
 66     //replace dialog
 67     void replaceDialog();
 68     //replace
 69     void replace();
 70     //replace all
 71     void replaceAll();
 72     //goto
 73     void gotoLine();
 74     //go to sub
 75     void gotoLineSub(int lineNumber);
 76     //select all
 77     void selectAll();
 78     //date
 79     void addTime();
 80     //auto new line
 81     void autoNewLine();
 82     //font dialog
 83     void fontDlg();
 84     //status bar
 85     void myStatusBar();
 86
 87     //update row and col
 88     void updateRowCol();
 89     //view help
 90     void viewHelp();
 91     //about
 92     void about();
 93 private:
 94     //create all actions
 95     void createActions();
 96     //create all menus
 97     void createMenus();
 98     //create textEdit
 99     void createOther();
100     //create all connectors
101     void createConnectors();
102     //add all shortcuts
103     void joinShortcuts();
104     //add all actions to menus
105     void joinActions();
106
107     //init size
108     void initSize();
109     //initialize menu status
110     void initMenuStatus();
111     //init status bar
112     void initStatusBar();
113     //init variables
114     void initVariables();
115     //init printer
116     void initPrinter();
117     //update ui
118     void updateAppUI();
119
120     //get file name info from file path
121     void showFileNameInfo(QString filePath);
122     //set file title and suffix
123     void setFileInfo(QString filePath);
124
125     //new file sub
126     bool newFileSub();
127     //open file sub
128     bool openFileSub();
129     //get file path
130     QString getOpenedFilePath();
131     //tip to save
132     int isToSave();
133     //save file
134     bool saveFileSub(QString filePath);
135     //get file path
136     QString getSavedFilePath(QString fileTitle = "");
137     //get file type from dialog selected type
138     QString getSelectedType(QString selectedType);
139     //replace sub
140     void replaceSub();
141     //update go to act
142     void updategotoAct();
143     //update scroll bar
144     void updateScrollBar();
145     //update text edit
146     void updateTextEdit();
147     //update status bar
148     void updateStatusBarAct();
149     //get column
150     int getColumn();
151     //get line
152     int getLine();
153     //update status bar
154     void updateStatusBar();
155 private:
156     //others
157     bool statusChecked;
158     bool autoChecked;
159     int oldPosition;
160     QStatusBar *m_statusBar;
161     QLabel *statusLabel;
162     GotoDialog *gotoDlg;
163     FindDialog *findDlg;
164     ReplaceDialog *replaceDlg;
165     FindData *findData;
166     QClipboard *clipboard;
167     QTextEdit *textEdit;
168     QPrinter *printer;
169     bool saved;
170     bool isFind;
171     QString fileTitle;
172     QString appTitle;
173     QString fileSuffix;
174     QString filePath;
175     QString fileType;
176     //all menus
177     QMenu *fileMenu;
178     QMenu *editMenu;
179     QMenu *formatMenu;
180     QMenu *viewMenu;
181     QMenu *helpMenu;
182     //all actions
183     QAction *newAct;
184     QAction *openAct;
185     QAction *saveAct;
186     QAction *saveAsAct;
187     QAction *pageSetupAct;
188     QAction *printAct;
189     QAction *quitAct;
190
191     QAction *undoAct;
192     QAction *redoAct;
193     QAction *cutAct;
194     QAction *copyAct;
195     QAction *pasteAct;
196     QAction *deleteAct;
197     QAction *findAct;
198     QAction *findNextAct;
199     QAction *replaceAct;
200     QAction *gotoAct;
201     QAction *selectAllAct;
202     QAction *timeAct;
203
204     QAction *autoNewLineAct;
205     QAction *fontAct;
206
207     QAction *statusBarAct;
208
209     QAction *viewHelpAct;
210     QAction *aboutNotepadAct;
211 };
212
213 #endif // NOTEPAD_H

4. 最后的成品大概是这样的, 其中有部分内容根据自己的喜好做了小改动, 差了一个图标, 有时间再弄下.

时间: 2024-10-24 05:41:59

QT-利用C++仿制windown自带的记事本程序V1.0的相关文章

sphider 丁廷臣简体中文完美汉化版带蜘蛛搜索引擎程序 v1.3.4

sphider 丁廷臣简体中文完美汉化版带蜘蛛搜索引擎程序 v1.3.4是最官方的新版,免费开源,用官方最新发布原版汉化.未更改任何内核文件. Sphider 是一个完美的带有蜘蛛的搜索引擎程序. Sphider是一个轻量级,采用PHP开发的web spider和搜索引擎,使用mysql来存储数据.可以利用它来为自己的网站添加搜索功能.Sphider非常小,易于安装和修改,已经有数千网站在使用它. 官方主页 http://www.sphider.eu/ 点击下载sphider 丁廷臣简体中文完美

利用C#自带组件强壮程序日志

前言 在项目正式上线后,如果出现错误.异常.崩溃等情况, 我们往往第一想到的事就是查看日志. 所以日志对于一个系统的维护是非常重要的. 声明 本文中的示例代码旨在这个框架是怎么工作的,具体实现可以自由发挥. 贯穿所有的日志系统 日志系统,往往是贯穿一个程序的所有代码的; 试想一下,如果你的日志完全是由第三方组件提供的; 那么就意味着,你的所有项目都必须引用这个dll; 也许你会说自己可以2次封装,那么依然需要所有项目都引用你的这个封装后的log项目, 另一方面 一些log组件需要实例化后才可以使

利用MAC OS X 自带的磁盘工具提取光盘镜像ISO文件

虽说渐渐地Mac笔记本基本告别内置光驱时代了,随着网络的普及,使用到光驱的机会也渐少,但有时又难免需要光驱,比如二货出版社的随书光盘等…我们可以通过USB外置光驱将光盘内容提取为ISO文件保存到电脑里,方便以后可以随时进行读取或重新再刻录成光盘. 利用MAC OS X 系统自带的“磁盘工具”即可实现光盘镜像提取功能. 1.“Finder”->”前往“->”实用工具“ 2.选择相应的光驱,然后选择“新建映像” 3.映像格式选择为”DVD/CD 主映像“,然后设定存储路径保存即可. 最后,会生成一

[转]利用C#自带组件强壮程序日志

利用C#自带组件强壮程序日志 在项目正式上线后,如果出现错误,异常,崩溃等情况 我们往往第一想到的事就是查看日志 所以日志对于一个系统的维护是非常重要的 声明 正文中的代码只是一个栗子,一个非常简单的栗子,只是说明这个框架是怎么工作的 具体实现可以自由发挥~~~~ 贯穿所有的日志系统 日志系统,往往是贯穿一个程序的所有代码的; 试想一下,如果你的日志完全是由第三方组件提供的; 那么就意味着,你的所有项目都必须引用这个dll; 也许你会说自己可以2次封装,那么依然需要所有项目都引用你的这个封装后的

利用ASP.NET里自带的站点地图工具制作网站站点地图

站点地图很方便能快速给我们导航我们要去访问的地址,能按层级关系分门别类,给用户一个很好的用户体验,很好的看到自己当前所在的网站位置 站点地图,又称网站地图,它就是一个页面,上面放置了网站上所有页面的链接.大多数人在网站上找不到自己所需要的信息时,可能会将网站地图作为一种补救措施.搜索引擎蜘蛛非常喜欢网站地图. 网站地图是一个网站所有链接的容器.很多网站的连接层次比较深,蜘蛛很难抓取到,网站地图可以方便搜索引擎蜘蛛抓取网站页面,通过抓取网站页面,清晰了解网站的架构,网站地图一般存放在根目录下并命名

利用Linux中的计划任务+PHP网页程序(转)

利用Linux中的计划任务+PHP网页程序,实现对web服务器运行状况的监测[每5分钟监测一次,并邮件提醒]一.我的监测服务器环境:rhel5.5+apache2.2+php5二.功能描述:写一个PHP页面,实现如下功能:请求要监控的WEB服务器的某一个页面的内容,如果返回不到数据,或者返回的数据里没有包含我期望的代码[用于自定义错误页面时的情况],那我就认为WEB服务出问题了[宕机或者遭到内容改写攻击],然后就发送一个邮件出来,这个邮件可以和手机进行绑定[139邮箱可以做到]而我在计划任务里去

如何用OpenCV自带的adaboost程序训练并检测目标

http://www.cnblogs.com/easymind223/archive/2012/07/03/2574826.html OpenCV自带的adaboost程序能够根据用户输入的正样本集与负样本集训练分类器,常用于人脸检测,行人检测等.它的默认特征采用了Haar,不支持其它特征. Adaboost的原理简述:(原文) 每个Haar特征对应看一个弱分类器,但并不是任伺一个Haar特征都能较好的描述人脸灰度分布的某一特点,如何从大量的Haar特征中挑选出最优的Haar特征并制作成分类器用

002带图标的程序菜单

技术要点: 要实现带图标的菜单,需要从CMenu类派生一个子类,并在子类中改写DrawItem方法和MeasureItem方法.基本思路如下: 首先,定义一个记录菜单项信息的结构CMenuItemInfo,该结构包含了菜单项的文本.图像索引.ID等信息. 然后,从CMenu中派生一个子类CIconMenu.在该类中定义一个方法ChangeMenuItem,利用递归的方式修改所有的菜单项信息,使其具有自绘风格(MF_OWNERDRAW). 接着,在CIconMenu类中定义绘制菜单项文本.绘制菜单

一个利用“永恒之蓝”漏洞传播的挖矿程序分析

背景介绍 近日,渔村安全团队追踪到一个利用永恒之蓝漏洞传播的挖矿程序,其具备高度的模块化和较强的传播能力,在短短数日就感染了数万台用户电脑.针对该突发情况,渔村安全团队迅速组织应急工作,最终使得目前的感染情况受到控制,下文为样本分析. 感染量 从微软发布ms17-010(永恒之蓝漏洞) 的修复补丁到现在已经过去四个月了,相继爆发的利用该漏洞传播的WannaCry,Petya 勒索病毒更是给 我们 上了一课.但目前来看,还是有不少用户没有及时更新补丁或者做相应的缓解措施,同时 Shadow Bro