功能完备的记事本

 这个是我QT大作业,具有如下功能,如果需要的话可以自行拿去代码,写的好的话,记得给个赞噢~

功能需求:

项目目标:设计并实现一个功能完备的记事本应用程序,参考Notepad3,进一步完善其基本功能,并增 加若干扩展功能,使其具备强大的编辑和文件管理能力。该记事本应能够支持多文件编辑、语法高亮、 文件收藏与书签等功能。

基本功能要求(必须具备的)

1. 多文件编辑: 支持同时打开多个文件,并在同一窗口中以标签页方式展示各个文件,用户可以方便地切换和 编辑文件。 提供文件的保存、关闭、另存为等常规文件操作。

2. 语法高亮显示: 支持常见的编程语言(如C/C++、Python、JavaScript、HTML等)的语法高亮显示。 提供简单的主题切换(如浅色和深色模式)以适应不同的开发环境需求。

3. 最近历史功能: 记录并展示最近打开的文件,用户可以快速访问历史文件。 支持最多10个历史文件的显示,并可根据需求清除历史记录。

4. 超链接检测与自动打开: 自动检测文本中的超链接(如URL、邮件地址等),并且当用户点击时,自动调用默认浏览器 打开链接。 提供对不同类型链接(HTTP、FTP、mailto等)的支持。

5. 书签功能: 用户可以为特定行添加书签,并能够通过书签快速跳转到文件中的相应位置。 支持管理书签(如删除、查看书签列表等)。

6. 收藏夹功能: 允许用户收藏常用文件的路径,使得文件可以通过收藏夹快速访问。 支持文件路径的添加、删除和管理,方便用户在多个项目之间切换。

基本的运行界面:

项目目录:

UI设计:

bookmark.h

#ifndef BOOKMARK_H
#define BOOKMARK_H

#include <QString>

class Bookmark
{
public:
    Bookmark(int line, const QString &text);

    int line() const;
    QString text() const;

private:
    int m_line;
    QString m_text;
};

#endif // BOOKMARK_H

customplaintextedit.h

#ifndef CUSTOMPLAINTEXTEDIT_H
#define CUSTOMPLAINTEXTEDIT_H

#include <QPlainTextEdit>

class CustomPlainTextEdit : public QPlainTextEdit
{
    Q_OBJECT

public:
    explicit CustomPlainTextEdit(QWidget *parent = nullptr);

protected:
    void mousePressEvent(QMouseEvent *event) override;
};

#endif // CUSTOMPLAINTEXTEDIT_H

favoritesmanager.h

#ifndef FAVORITESMANAGER_H
#define FAVORITESMANAGER_H

#include <QObject>
#include <QStringListModel>

class FavoritesManager : public QObject
{
    Q_OBJECT

public:
    explicit FavoritesManager(QObject *parent = nullptr);

    QStringListModel* model() const;
    void addFavorite(const QString &path);
    void removeFavorite(const QString &path);

private:
    QStringListModel *m_model;
};

#endif // FAVORITESMANAGER_H

highlighter.h

#ifndef HIGHLIGHTER_H
#define HIGHLIGHTER_H

#include <QSyntaxHighlighter>
#include <QTextCharFormat>
#include <QRegularExpression>

class Highlighter : public QSyntaxHighlighter {
    Q_OBJECT

public:
    Highlighter(QTextDocument *parent = nullptr, const QString &language = "C");

protected:
    void highlightBlock(const QString &text) override;

private:
    void setupCLanguage();
    void setupPythonLanguage();
    void setupJavaScriptLanguage();
    void setupHTMLLanguage();

    QString currentLanguage;
    QVector<QRegularExpression> keywordPatterns;
    QTextCharFormat keywordFormat;
    QTextCharFormat singleLineCommentFormat;
    QTextCharFormat multiLineCommentFormat;
    QTextCharFormat stringFormat;
    QTextCharFormat functionFormat;
    QTextCharFormat numberFormat;
    QTextCharFormat operatorFormat;
};

#endif // HIGHLIGHTER_H

mainwindow.h

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include <QLabel>
#include <QTextEdit>
#include <QColorDialog>
#include <QPlainTextEdit>
#include "highlighter.h"
#include "recentfiles.h"
#include <QListWidget>
#include "customplaintextedit.h"
#include "bookmark.h"
#include <QInputDialog>
#include "favoritesmanager.h"
QT_BEGIN_NAMESPACE
namespace Ui {
class MainWindow;
}
QT_END_NAMESPACE

class MainWindow : public QMainWindow //MainWindow类继承自QMainWindow类
{
    Q_OBJECT  //Q_OBJECT是一个宏(macro),在Qt框架中用于支持Qt的元对象系统(Meta-Object System)。这是一个非常重要的宏,用于在Qt类中启用某些功能,比如信号和槽(signals and slots)、属性(properties)、以及类信息(class information)

public:
    MainWindow(QWidget *parent = nullptr);//nullptr是空指针
    ~MainWindow();//析构函数的声明

private slots:
    void on_actionNew_triggered();
    void on_actionOpen_triggered();
    void on_actionSave_triggered();
    void on_actionSaveas_triggered();
    void on_textEdit_textChanged();
    void on_actionExit_triggered();
    void on_actionbackcolor_triggered();
    void closeTab(void);
    void setLanguageC();
    void setLanguagePython();
    void setLanguageJavaScript();
    void setLanguageHTML();
    void clearHistory();
    void viewHistory(); // 添加新的槽函数声明 
    void addBookmark();
    void goToBookmark();
    void deleteBookmark();
    void showBookmarks();

    // void addAction_triggered();
    // void removeAction_triggered();
    // void viewAction_triggered();

    void on_actionAddSC_triggered();

    void on_actionRemoveSC_triggered();

    void on_actionViewSC_triggered();

private:
    Ui::MainWindow *ui;
    QLabel statusCursorLabel;
    QLabel statusLabel;
    QString filePath;
    bool textChanged;
    bool textEditConfirmed();
    int i=1;
    QTabWidget *tabWidget;
    QMap<QPlainTextEdit*, QString> filePaths; //用于存储键值对,它将QTextEdit指针作为键,将QString作为值
    QPlainTextEdit *textEdit;
    Highlighter *highlighter;
    RecentFiles recentFiles;
    QDialog *historyDialog; // 新增用于显示历史记录的对话框
    QListWidget *historyListWidget; // 新增用于显示历史记录的控件
    QMap<int, Bookmark> bookmarks;
    FavoritesManager *favoritesManager;
};
#endif // MAINWINDOW_H

recentfiles.h

#ifndef RECENTFILES_H
#define RECENTFILES_H

#include <QStringList>

class RecentFiles {
public:
    RecentFiles();
    void addFile(const QString &fileName);
    void clearHistory();
    QStringList getHistory() const;
    void loadHistory();

private:
    QStringList history;
    const int maxHistorySize = 10;
};

#endif // RECENTFILES_H

bookmark.cpp

#include "bookmark.h"

// 构造函数
Bookmark::Bookmark(int line, const QString &text)
    : m_line(line), m_text(text)
{
}

// 获取行号
int Bookmark::line() const
{
    return m_line;
}

// 获取文本
QString Bookmark::text() const
{
    return m_text;
}

customplaintextedit.cpp

#include "customplaintextedit.h"
#include <QRegularExpression>
#include <QDesktopServices>
#include <QUrl>

CustomPlainTextEdit::CustomPlainTextEdit(QWidget *parent)
    : QPlainTextEdit(parent)
{
}

void CustomPlainTextEdit::mousePressEvent(QMouseEvent *event)
{
    if (event->button() == Qt::LeftButton)//查是否是鼠标左键被点击
    {
        QTextCursor cursor = cursorForPosition(event->pos());//QTextCursor cursor = cursorForPosition(event->pos());

        QString text = toPlainText();//文本编辑器中的所有文本

        // 则表达式匹配URL和电子邮件地址s
        QRegularExpression regex(R"((http|https|ftp):\/\/[^\s/$.?#].[^\s]*|mailto:\S+)");
        auto matches = regex.globalMatch(text);
        //遍历所有匹配项
        while (matches.hasNext())
        {
            auto match = matches.next();
            int start = match.capturedStart();
            int end = match.capturedEnd();

            if (cursor.position() >= start && cursor.position() <= end)
            {
                QUrl url(match.captured());
                QDesktopServices::openUrl(url);
                break;
            }
        }
    }

    QPlainTextEdit::mousePressEvent(event);//这行代码调用基类QPlainTextEdit的mousePressEvent函数,确保其他鼠标点击事件被正常处理
}

favoritesmanager.cpp

#include "favoritesmanager.h"

FavoritesManager::FavoritesManager(QObject *parent) :
    QObject(parent),
    m_model(new QStringListModel(this))
{
}

QStringListModel* FavoritesManager::model() const
{
    return m_model;
}

void FavoritesManager::addFavorite(const QString &path)
{
    QStringList list = m_model->stringList();
    if (!list.contains(path)) {
        list.append(path);
        m_model->setStringList(list);
    }
}

void FavoritesManager::removeFavorite(const QString &path)
{
    QStringList list = m_model->stringList();
    list.removeAll(path);
    m_model->setStringList(list);
}

highlighter.cpp

#include "highlighter.h"
//:: 是作用域解析运算符(Scope Resolution Operator)。它用于访问类、结构体、命名空间或枚举中的成员
Highlighter::Highlighter(QTextDocument *parent, const QString &language)//这是 Highlighter 类的构造函数,位于类的外部定义。前面的 Highlighter:: 表示这是 Highlighter 类的成员函数
    : QSyntaxHighlighter(parent), currentLanguage(language) {
    if (language == "C") {
        setupCLanguage();
    } else if (language == "Python") {
        setupPythonLanguage();
    } else if (language == "JavaScript") {
        setupJavaScriptLanguage();
    } else if (language == "HTML") {
        setupHTMLLanguage();
    }
}

//用于对文本块进行语法高亮处理
void Highlighter::highlightBlock(const QString &text) {
    for (const auto &pattern : keywordPatterns) {
        QRegularExpressionMatchIterator matchIterator = pattern.globalMatch(text);
        while (matchIterator.hasNext()) {
            QRegularExpressionMatch match = matchIterator.next();
            setFormat(match.capturedStart(), match.capturedLength(), keywordFormat);
        }
    }

    // Hig
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值