您的位置:首页 > 编程语言 > C语言/C++

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

2015-10-25 16:14 459 查看
  下班无事, 发现QT还是很好用的, 就仿制windows的记事本做了一个,未彻底DEBUG, 先拿来分享下.

windows记事本大概是这样的:



大概分为以下几步:

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", 12);

textEdit->setFont(font);

updateScrollBar();

updateTextEdit();

QHBoxLayout *mainLayout = new QHBoxLayout;

mainLayout->setMargin(0);//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. 每个菜单的逻辑, 这个要设计以下, 不能一上来就写代码, 容易返工,最后乱成一团



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++ 记事本