QT学习实战 — 仿window的notepad实现简单的记事本工具

仿window记事本设计界面

在这里插入图片描述
主区域只添加一个控件 —— TextEdit。仿照window的记事本工具设计菜单栏,菜单栏选项以及每个菜单项下的Action可以直接使Qt Designer界面进行添加修改名字。

双击在Action Editor的每一项可以给选项添加图标
在这里插入图片描述

给工具栏添加图标直接将Action Editor的每一项往工具栏上拖就可以给工具栏添加图标。点击工具栏图标和点击菜单栏的每个Action的动作是一样的。

一般文本编辑工具都会提供copypastecutundo等操作,而这些功能Qt的TextEdit控件已经提供。TextEdit也自带鼠标右键等快捷键。

一些常用的TextEdit信号:

[slot] void QTextEdit::copy()
[slot] void QTextEdit::cut()
[slot] void QTextEdit::paste()
[slot] void QTextEdit::selectAll()
[slot] void QTextEdit::undo()

TextEdit的帮助文档中可以看到,还有很多槽,除了实现常见的文本编辑功能,还可以实现很多功能,如查找、放大、缩小、对齐等等。

文件菜单下的功能实现

1、新建文件

//新建文件
void MyNotepad::newFile(void)
{
    
    
    if (ui->textEdit->document()->isModified()) //判断编辑区内容是否改变
    {
    
    
        qDebug() << "document is modified";
        switch (requestIsSave())               //是否要保存
        {
    
    
            case QMessageBox::Yes :            //保存
                saveDocumentText();

                if (!currentfileName.isEmpty())
                {
    
    
                    currentfileName.clear();
                }

                setDocumentTitile("untitled -- notepad");
                ui->textEdit->document()->clear();
                break;
            case QMessageBox::No :
                setDocumentTitile("untitled -- notepad");
                ui->textEdit->document()->clear();
                break;
            case QMessageBox::Cancel :
                qDebug() << "取消";
                break;
            default:
                break;
        }
    }
    else
    {
    
    
        qDebug() << "document is not modified";
    }
}

执行新建文件前首先要判断编辑区内容是否改变,如果改变了就先保存再新建。

2、打开文件

void MyNotepad::openFile(void)
{
    
    
    if (ui->textEdit->document()->isModified()) //编辑区内容是否改变
    {
    
    
        saveDocumentText();                     //保存文本
    }
    getDocumentText();                          //获取文件内容
    setDocumentTitile(currentfileName);         //在菜单栏上方显示文本的标题
}

对于打开文件,同样判断编辑区内容是否改变,内容改变就先保存然后再获取打开的文本内容显示到编辑区中,根据文件名设置显示文本标题。

3、保存文件

void MyNotepad::saveFile(void)
{
    
    
    if (ui->textEdit->document()->isModified() || !currentfileName.isEmpty())
    {
    
    
        QString tmpFileName = saveDocumentText();
        setDocumentTitile(tmpFileName);
        currentfileName = tmpFileName;
    }
}

当文本编辑区内容改变或者已经有打开的文件,点击save file的Action才会进行相应

4、文件另存为

void MyNotepad::saveAsFile()
{
    
    
    if (ui->textEdit->document()->isModified())
    {
    
    
        QString tmpFileName = currentfileName;
        currentfileName.clear();       
        saveDocumentText();
        currentfileName = tmpFileName;
    }
}

同样也要判断编辑区内容是否改变。saveDocumentText()函数只针对新建文件还没保存和已经打开文件做了保存处理,而另存为要重新命名保存成另一个文件。

为避免写重复代码,这里将当前打开的文件名先保存、清空,saveDocumentText()就会变成保存新建文件的功能就能给重新起名保存文件,接着再恢复当前打开的文件名。

5、退出notepad

void MyNotepad::exitNotepad()
{
    
    
    if (ui->textEdit->document()->isModified())
    {
    
    
        switch (requestIsSave())
        {
    
    
            case QMessageBox::Yes :
                saveDocumentText();
                this->close();
                break;
            case QMessageBox::No :
                this->close();
                break;
            case QMessageBox::Cancel :
                qDebug() << "取消";
                break;
            default:
                break;
        }
    }
}

要退出时判断编辑区内容是否改变,当内容有改变让用户选择保存还是不保存。


编辑菜单栏的功能实现

1、复制、粘贴、撤销 etc.

对于复制、粘贴、撤销等功能,QTextEdit已经提供相应的槽,所以将相应的Action的点击触发信号连接到相应的槽即可。

connect(ui->copyAction, &QAction::triggered, ui->textEdit, &QTextEdit::copy);
connect(ui->cutAction, &QAction::triggered, ui->textEdit, &QTextEdit::cut);
connect(ui->pasteAction, &QAction::triggered, ui->textEdit, &QTextEdit::paste);
connect(ui->undoAction, &QAction::triggered, ui->textEdit, &QTextEdit::undo);
connect(ui->selectAllAction, &QAction::triggered, ui->textEdit, &QTextEdit::selectAll);

2、添加当前日期

需要包含头文件

#include <QDateTime>

连接自定义槽

 connect(ui->dateAction, &QAction::triggered, this, &MyNotepad::setDateTime);
void MyNotepad::setDateTime()
{
    
    
    //QDateTime::currentDateTime().toString() 获取当前日期并转成字符串
    ui->textEdit->append(QDateTime::currentDateTime().toString());
}

向文本编辑区添加日期。


格式菜单选项功能实现

格式菜单选项可以设置字体颜色。功能实现就是运用了字体和颜色标准对话框

选择字体:

void MyNotepad::selectFont()
{
    
    
    bool ok;
    QFont font = QFontDialog::getFont(&ok, this);
    if (ok)
    {
    
    
        ui->textEdit->setFont(font);
    }
}

选择颜色:

void MyNotepad::selectColor()
{
    
    
    QColor color = QColorDialog::getColor(Qt::yellow, this, tr("选择颜色"));
    ui->textEdit->setTextColor(color);
}

帮助菜单栏功能实现

帮助菜单栏有两个Action —— 查看帮助和关于

查看帮助就用QDesktopServices简单打开了个网址

void MyNotepad::seeHelp(void)
{
    
    
    QUrl url("https://me.csdn.net/qq_36413982?ref=miniprofile");
    QDesktopServices::openUrl(url);
}

关于Action

void MyNotepad::doForAboutAction()
{
    
    
//    QMessageBox::about(this, tr("关于"), tr("简单的记事本工具 - write by Ares"));
    AboutDialog about;
    about.exec();
}

创建一个对话框,显示了一行文字而已。


完整代码:
https://gitee.com/guangjieMVP/MyNotepad_Qt


对于初学不久自己一字一句写出个小东西还是挺开心。 尽管查看菜单选项没有实现以及很多不合理或者要改进的地方,比如没有添加查找功能。
对于查找功能相关类也有提供相应的方法,实现起来应该也不是很难吧。

猜你喜欢

转载自blog.csdn.net/qq_36413982/article/details/108187590