下班无事, 发现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 //paste101 connect(pasteAct, SIGNAL(triggered()), this, SLOT(paste()));102 //del103 connect(deleteAct,SIGNAL(triggered()), this, SLOT(del()) );104 //find dialog105 connect(findAct, SIGNAL(triggered()), this, SLOT(findDialog()));106 //find next107 connect(findNextAct, SIGNAL(triggered()), this, SLOT(findNext()));108 //replace dialog109 connect(replaceAct, SIGNAL(triggered()), this, SLOT(replaceDialog()));110 //go to dialog111 connect(gotoAct, SIGNAL(triggered()), this, SLOT(gotoLine()));112 //select all113 connect(selectAllAct, SIGNAL(triggered()), this, SLOT(selectAll()));114 //add date115 connect(timeAct, SIGNAL(triggered()), this, SLOT(addTime()));116 //auto new line117 connect(autoNewLineAct, SIGNAL(triggered()), this, SLOT(autoNewLine()));118 //font dlg119 connect(fontAct, SIGNAL(triggered()), this, SLOT(fontDlg()));120 //status bar121 connect(statusBarAct, SIGNAL(triggered()), this, SLOT(myStatusBar()));122 //view help123 connect(viewHelpAct, SIGNAL(triggered()), this, SLOT(viewHelp()));124 //about125 connect(aboutNotepadAct, SIGNAL(triggered()), this, SLOT(about()));126 }127 128 //add all shortcuts129 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 menus161 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 #include11 #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 connectors101 void createConnectors();102 //add all shortcuts103 void joinShortcuts();104 //add all actions to menus105 void joinActions();106 107 //init size108 void initSize();109 //initialize menu status110 void initMenuStatus();111 //init status bar112 void initStatusBar();113 //init variables114 void initVariables();115 //init printer116 void initPrinter();117 //update ui118 void updateAppUI();119 120 //get file name info from file path121 void showFileNameInfo(QString filePath);122 //set file title and suffix123 void setFileInfo(QString filePath);124 125 //new file sub126 bool newFileSub();127 //open file sub128 bool openFileSub();129 //get file path130 QString getOpenedFilePath();131 //tip to save132 int isToSave();133 //save file134 bool saveFileSub(QString filePath);135 //get file path136 QString getSavedFilePath(QString fileTitle = "");137 //get file type from dialog selected type138 QString getSelectedType(QString selectedType);139 //replace sub140 void replaceSub();141 //update go to act142 void updategotoAct();143 //update scroll bar144 void updateScrollBar();145 //update text edit146 void updateTextEdit();147 //update status bar148 void updateStatusBarAct();149 //get column150 int getColumn();151 //get line152 int getLine();153 //update status bar154 void updateStatusBar();155 private:156 //others157 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 menus177 QMenu *fileMenu;178 QMenu *editMenu;179 QMenu *formatMenu;180 QMenu *viewMenu;181 QMenu *helpMenu;182 //all actions183 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. 最后的成品大概是这样的, 其中有部分内容根据自己的喜好做了小改动, 差了一个图标, 有时间再弄下.