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 (gongsunyongwu@163.com)
  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 
 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. 最后的成品大概是这样的, 其中有部分内容根据自己的喜好做了小改动, 差了一个图标, 有时间再弄下.