下班無事, 發現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. 最後的成品大概是這樣的, 其中有部分內容根據自己的喜好做了小改動, 差了一個圖標, 有時間再弄下.