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

来源:互联网 发布:需要人陪 王力宏 知乎 编辑:程序博客网 时间:2024/06/07 11:08

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







0 0
原创粉丝点击