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

时间:2023-03-09 06:10:28
QT-利用C++仿制windown自带的记事本程序V1.0

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

windows记事本大概是这样的:

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

大概分为以下几步:

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

 //create all actions
void Notepad::createActions()
{
newAct = new QAction(tr("新建(&N)"), this);
openAct = new QAction(tr("打开(&O)"), this);
saveAct = new QAction(tr("保存(&S)"), this);
saveAsAct = new QAction(tr("另存为(&A)..."), this);
pageSetupAct = new QAction(tr("页面设置(&U)..."), this);
printAct = new QAction(tr("打印(&P)..."), this);
quitAct = new QAction(tr("退出(&Q)"), this); undoAct = new QAction(tr("撤消(&U)"), this);
redoAct = new QAction(tr("重做(&R)"), this);
cutAct = new QAction(tr("剪切(&T)"), this);
copyAct = new QAction(tr("复制(&C)"), this);
pasteAct = new QAction(tr("粘贴(&P)"), this);
deleteAct = new QAction(tr("删除(&L)"), this);
findAct = new QAction(tr("查找(&F)..."), this);
findNextAct = new QAction(tr("查找下一个(&N)"), this);
replaceAct = new QAction(tr("替换(&E)..."), this);
gotoAct = new QAction(tr("转到(&G)..."), this);
selectAllAct = new QAction(tr("全选(&A)"), this);
timeAct = new QAction(tr("时间/日期(&D)"), this); autoNewLineAct = new QAction(tr("自动换行(&L)"), this);
fontAct = new QAction(tr("字体(&F)..."), this); statusBarAct = new QAction(tr("状态栏(&S)"), this); viewHelpAct = new QAction(tr("查看帮助(&H)"), this);
aboutNotepadAct = new QAction(tr("关于记事本(&A)"), this);
} //create all munus
void Notepad::createMenus()
{
fileMenu = this->menuBar()->addMenu(tr("文件(&F)"));
editMenu = this->menuBar()->addMenu(tr("编辑(&E)"));
formatMenu = this->menuBar()->addMenu(tr("格式(&O)"));
viewMenu = this->menuBar()->addMenu(tr("查看(&V)"));
helpMenu = this->menuBar()->addMenu(tr("帮助(&H)"));
} //create textEdit
void Notepad::createOther()
{
clipboard = QApplication::clipboard();
QWidget *widget = new QWidget;
textEdit = new QTextEdit();
textEdit->setAcceptRichText(false);
//set font
QFont font("Arial", );
textEdit->setFont(font);
updateScrollBar();
updateTextEdit();
QHBoxLayout *mainLayout = new QHBoxLayout;
mainLayout->setMargin();//important
mainLayout->addWidget(textEdit); widget->setLayout(mainLayout);
setCentralWidget(widget);
} //create all connectors
void Notepad::createConnectors()
{
connect(textEdit, SIGNAL(undoAvailable(bool)), this, SLOT(updateUndoAct(bool)));
connect(textEdit, SIGNAL(redoAvailable(bool)), this, SLOT(updateRedoAct(bool)));
connect(textEdit, SIGNAL(copyAvailable(bool)), this, SLOT(updateCutAct(bool)));
connect(textEdit, SIGNAL(copyAvailable(bool)), this, SLOT(updateCopyAct(bool)));
connect(textEdit, SIGNAL(copyAvailable(bool)), this, SLOT(updateDeleteAct(bool)));
connect(textEdit, SIGNAL(textChanged()), this, SLOT(updateFindGroupActs()));
connect(textEdit, SIGNAL(textChanged()), this, SLOT(updateSelectAllAct()));
connect(textEdit, SIGNAL(textChanged()), this, SLOT(updateRowCol()));
connect(clipboard, SIGNAL(dataChanged()), this, SLOT(updatePasteAct()));
connect(this, SIGNAL(saveSignal(bool)), this, SLOT(updateSaveAct(bool)));
//new file
connect(newAct, SIGNAL(triggered()), this, SLOT(newFile()));
//open file
connect(openAct, SIGNAL(triggered()), this, SLOT(openFile()));
//save file
connect(saveAct, SIGNAL(triggered()), this, SLOT(saveFile()));
//save as file
connect(saveAsAct, SIGNAL(triggered()), this, SLOT(saveAsFile()));
//page setup
connect(pageSetupAct, SIGNAL(triggered()), this, SLOT(pageSetup()));
//print
connect(printAct, SIGNAL(triggered()), this, SLOT(print()));
//close
connect(quitAct, SIGNAL(triggered()), this, SLOT(quit())); //undo
connect(undoAct, SIGNAL(triggered()), this, SLOT(undo()));
//redo
connect(redoAct, SIGNAL(triggered()), this, SLOT(redo()));
//cut
connect(cutAct, SIGNAL(triggered()), this, SLOT(cut()));
//copy
connect(copyAct, SIGNAL(triggered()), this, SLOT(copy()));
//paste
connect(pasteAct, SIGNAL(triggered()), this, SLOT(paste()));
//del
connect(deleteAct,SIGNAL(triggered()), this, SLOT(del()) );
//find dialog
connect(findAct, SIGNAL(triggered()), this, SLOT(findDialog()));
//find next
connect(findNextAct, SIGNAL(triggered()), this, SLOT(findNext()));
//replace dialog
connect(replaceAct, SIGNAL(triggered()), this, SLOT(replaceDialog()));
//go to dialog
connect(gotoAct, SIGNAL(triggered()), this, SLOT(gotoLine()));
//select all
connect(selectAllAct, SIGNAL(triggered()), this, SLOT(selectAll()));
//add date
connect(timeAct, SIGNAL(triggered()), this, SLOT(addTime()));
//auto new line
connect(autoNewLineAct, SIGNAL(triggered()), this, SLOT(autoNewLine()));
//font dlg
connect(fontAct, SIGNAL(triggered()), this, SLOT(fontDlg()));
//status bar
connect(statusBarAct, SIGNAL(triggered()), this, SLOT(myStatusBar()));
//view help
connect(viewHelpAct, SIGNAL(triggered()), this, SLOT(viewHelp()));
//about
connect(aboutNotepadAct, SIGNAL(triggered()), this, SLOT(about()));
} //add all shortcuts
void Notepad::joinShortcuts()
{
newAct->setShortcut(QKeySequence::New);
openAct->setShortcut(QKeySequence::Open);
saveAct->setShortcut(QKeySequence::Save);
//saveAsAct->setShortcut(QKeySequence::SaveAs);
saveAsAct->setShortcut(QKeySequence(tr("Ctrl+Shift+S")));
pageSetupAct->setShortcut(QKeySequence(tr("Ctrl+E")));
printAct->setShortcut(QKeySequence::Print);
quitAct->setShortcut(QKeySequence(tr("Ctrl+Q")));
//quitAct->setShortcut(QKeySequence::Quit); undoAct->setShortcut(QKeySequence::Undo);
redoAct->setShortcut(QKeySequence::Redo);
cutAct->setShortcut(QKeySequence::Cut);
copyAct->setShortcut(QKeySequence::Copy);
pasteAct->setShortcut(QKeySequence::Paste);
deleteAct->setShortcut(QKeySequence::Delete);
newAct->setShortcut(QKeySequence::New); findAct->setShortcut(QKeySequence::Find);
findNextAct->setShortcut(QKeySequence::FindNext);
replaceAct->setShortcut(QKeySequence::Replace); gotoAct->setShortcut(QKeySequence(tr("Ctrl+G")));
selectAllAct->setShortcut(QKeySequence::SelectAll);
timeAct->setShortcut(QKeySequence(tr("F5"))); viewHelpAct->setShortcut(QKeySequence::HelpContents);
} //add all actions to menus
void Notepad::joinActions()
{
fileMenu->addAction(newAct);
fileMenu->addAction(openAct);
fileMenu->addAction(saveAct);
fileMenu->addAction(saveAsAct);
fileMenu->addSeparator();
fileMenu->addAction(pageSetupAct);
fileMenu->addAction(printAct);
fileMenu->addSeparator();
fileMenu->addAction(quitAct); editMenu->addAction(undoAct);
editMenu->addAction(redoAct);
editMenu->addSeparator();
editMenu->addAction(cutAct);
editMenu->addAction(copyAct);
editMenu->addAction(pasteAct);
editMenu->addAction(deleteAct);
editMenu->addSeparator();
editMenu->addAction(findAct);
editMenu->addAction(findNextAct);
editMenu->addAction(replaceAct);
editMenu->addAction(gotoAct);
editMenu->addSeparator();
editMenu->addAction(selectAllAct);
editMenu->addAction(timeAct); formatMenu->addAction(autoNewLineAct);
formatMenu->addAction(fontAct); viewMenu->addAction(statusBarAct); helpMenu->addAction(viewHelpAct);
helpMenu->addSeparator();
helpMenu->addAction(aboutNotepadAct);
}

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

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

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

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

 /*************************************
**fileName: notepad.h
**author: kakasi (gongsunyongwu@163.com)
**version: v1.0
**date: 2015-10-14
**last edit date: 2015-10-24 by kakasi
**************************************/
#ifndef NOTEPAD_H
#define NOTEPAD_H
#include <QMainWindow>
#include "common.h" class QTextEdit;
class QAction;
class QMenu;
class QClipboard;
class QPrinter;
class FindDialog;
class ReplaceDialog;
class GotoDialog;
class QLabel;
class Notepad : public QMainWindow
{
Q_OBJECT
public:
Notepad(); signals:
void saveSignal(bool b); private slots:
//========update acts=======
void updateUndoAct(bool b);
void updateRedoAct(bool b);
void updateCutAct(bool b);
void updateCopyAct(bool b);
void updateDeleteAct(bool b);
void updatePasteAct();
void updateSaveAct(bool b);
void updateFindGroupActs();
void updateSelectAllAct();
void remberOldPosition();
void printPreview(QPrinter *printer);
//========actions=========
void newFile();
void openFile();
bool saveFile();
bool saveAsFile();
void pageSetup();
void print();
void quit(); void undo();
void redo();
void cut();
void copy();
void paste();
void del(); void findDialog();
//find string
void findString(FindData *findData);
//find next
void findNext(); //replace dialog
void replaceDialog();
//replace
void replace();
//replace all
void replaceAll();
//goto
void gotoLine();
//go to sub
void gotoLineSub(int lineNumber);
//select all
void selectAll();
//date
void addTime();
//auto new line
void autoNewLine();
//font dialog
void fontDlg();
//status bar
void myStatusBar(); //update row and col
void updateRowCol();
//view help
void viewHelp();
//about
void about();
private:
//create all actions
void createActions();
//create all menus
void createMenus();
//create textEdit
void createOther();
//create all connectors
void createConnectors();
//add all shortcuts
void joinShortcuts();
//add all actions to menus
void joinActions(); //init size
void initSize();
//initialize menu status
void initMenuStatus();
//init status bar
void initStatusBar();
//init variables
void initVariables();
//init printer
void initPrinter();
//update ui
void updateAppUI(); //get file name info from file path
void showFileNameInfo(QString filePath);
//set file title and suffix
void setFileInfo(QString filePath); //new file sub
bool newFileSub();
//open file sub
bool openFileSub();
//get file path
QString getOpenedFilePath();
//tip to save
int isToSave();
//save file
bool saveFileSub(QString filePath);
//get file path
QString getSavedFilePath(QString fileTitle = "");
//get file type from dialog selected type
QString getSelectedType(QString selectedType);
//replace sub
void replaceSub();
//update go to act
void updategotoAct();
//update scroll bar
void updateScrollBar();
//update text edit
void updateTextEdit();
//update status bar
void updateStatusBarAct();
//get column
int getColumn();
//get line
int getLine();
//update status bar
void updateStatusBar();
private:
//others
bool statusChecked;
bool autoChecked;
int oldPosition;
QStatusBar *m_statusBar;
QLabel *statusLabel;
GotoDialog *gotoDlg;
FindDialog *findDlg;
ReplaceDialog *replaceDlg;
FindData *findData;
QClipboard *clipboard;
QTextEdit *textEdit;
QPrinter *printer;
bool saved;
bool isFind;
QString fileTitle;
QString appTitle;
QString fileSuffix;
QString filePath;
QString fileType;
//all menus
QMenu *fileMenu;
QMenu *editMenu;
QMenu *formatMenu;
QMenu *viewMenu;
QMenu *helpMenu;
//all actions
QAction *newAct;
QAction *openAct;
QAction *saveAct;
QAction *saveAsAct;
QAction *pageSetupAct;
QAction *printAct;
QAction *quitAct; QAction *undoAct;
QAction *redoAct;
QAction *cutAct;
QAction *copyAct;
QAction *pasteAct;
QAction *deleteAct;
QAction *findAct;
QAction *findNextAct;
QAction *replaceAct;
QAction *gotoAct;
QAction *selectAllAct;
QAction *timeAct; QAction *autoNewLineAct;
QAction *fontAct; QAction *statusBarAct; QAction *viewHelpAct;
QAction *aboutNotepadAct;
}; #endif // NOTEPAD_H

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

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