这个是我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