一、准备工作
1、软件方面:准备一个 Qt Creator 软件。
2、网站:iconfont-阿里巴巴矢量图标库,从这个网站里可以获取到你需要的图标。
3、硬件:准备一台电脑。
4、准备好空空的大脑,准备接收新的知识。
每日QT查询表https://mp.csdn.net/mp_blog/creation/editor/141787249
二、构思自己想要的记事本样式
1、我以自己电脑自带的记事本为例,简单的描述一下所需要的功能
①文件打开功能
②文件保存功能
③文件读取功能
④判断当前光标处于位置
⑤文件编码格式
三、UI界面设计
1、基础控件设计
2、引用图片美化UI
3、最终UI界面展示
四、功能设计
1、UI界面运行优化
1.1 存在问题
1.2 解决方法
在wiget.cpp文件下加入以下划线代码
this->setLayout(ui->verticalLayout);
2、 引入信号与槽设计打开,保存,关闭功能
2.1 文件打开功能
2.1.1 代码展示
2.1.2 源码
// 弹出文件选择对话框
fileName = QFileDialog::getOpenFileName(this, tr("Open File"), "", tr("Text Files (*.txt *.doc);;All Files (*)"));
if (!fileName.isEmpty()) {
qDebug() << "Selected file:" << fileName;
// 设置文件名
file.setFileName(fileName);
// 打开文件并读取内容
if (!file.open(QIODevice::ReadOnly | QIODevice::Text)) {
qDebug() << "Failed to open file:" << fileName;
return;
}
// 设置QTextStream使用的字符编码
QTextStream in(&file);
in.setCodec("UTF-8"); // 默认使用UTF-8编码,可以根据需要更改
// 清空textEdit的内容
ui->textEdit->clear();
// 将文件指针移至文件开头
file.seek(0);
// 读取文件内容并显示在textEdit上
while (!in.atEnd()) {
QString line = in.readLine();
ui->textEdit->append(line);
}
// 关闭文件
file.close();
} else {
qDebug() << "No file selected or operation cancelled by user.";
}
2.2 文件保存功能
2.2.1 代码展示
2.2.2 源码
void Widget::on_saveButton_clicked()
{
// 打开文件保存对话框
QString fileName = QFileDialog::getSaveFileName(this, tr("Save File"), "", tr("Text Files (*.txt);;All Files (*)"));
if (fileName.isEmpty()) {
return;
}
// 尝试打开文件
QFile file(fileName);
if (!file.open(QIODevice::WriteOnly | QIODevice::Text)) {
QMessageBox::warning(this, tr("Warning"), tr("Cannot open file for writing: %1").arg(file.errorString()));
return;
}
// 使用 QTextStream 来写入文件内容
QTextStream out(&file);
out << ui->textEdit->toPlainText();
// 关闭文件
file.close();
}
2.3 文件关闭功能
2.3.1 代码展示
2.3.2 源码
void Widget::on_closeButton_clicked()
{
QMessageBox msgBox;
QFile file;
int ret = QMessageBox::warning(this, tr("MyNoteBook Notice:"),
tr("The document has been modified.\n"
"Do you want to save your changes?"),
QMessageBox::Save | QMessageBox::Discard
| QMessageBox::Cancel,
QMessageBox::Save);
switch (ret) {
case QMessageBox::Save:
// 保存被点击
on_saveButton_clicked();
qDebug() << "QMessageBox::Save:";
break;
case QMessageBox::Discard:
// 不保存被点击
ui->textEdit->clear();
if (file.isOpen()) {
file.close();
this->setWindowTitle("MyNoteBook");
}
qDebug() << "QMessageBox::Discard:";
break;
case QMessageBox::Cancel:
// 取消被点击
qDebug() << "QMessageBox::Cancel:";
break;
default:
// 不应该到达这里
break;
}
}
3、快捷键实现字体大小变化
3.1 快捷键关联
3.1.1 代码展示
3.1.2 源码
void Widget::on_increaseFontSize()
{
// 获取当前字体大小
QFont font = ui->textEdit->font();
int fontSize = font.pointSize();
// 增加字体大小
font.setPointSize(fontSize + 2);
// 应用新字体
ui->textEdit->setFont(font);
}
3.2 字体变大
3.2.1 代码展示
3.2.2 源码
QShortcut *increaseFontSizeShortcut = new QShortcut(QKeySequence(Qt::CTRL + Qt::Key_Plus), this);//绑定了“Ctrl++”为字体变大
connect(increaseFontSizeShortcut, &QShortcut::activated, this, &Widget::on_increaseFontSize);
QShortcut *decreaseFontSizeShortcut = new QShortcut(QKeySequence(Qt::CTRL + Qt::Key_Minus), this);//绑定了“Ctrl+-”为字体变大
connect(decreaseFontSizeShortcut, &QShortcut::activated, this, &Widget::on_decreaseFontSize);
3.3 字体变小
3.3.1 代码展示
3.3.2 源码
void Widget::on_decreaseFontSize()
{
// 获取当前字体大小
QFont font = ui->textEdit->font();
int fontSize = font.pointSize();
// 减少字体大小
font.setPointSize(fontSize - 2);
// 应用新字体
ui->textEdit->setFont(font);
}
4、打开、关闭、保存设置快捷键
4.1 源码
QShortcut *on_openButton_clickedShortcut = new QShortcut(QKeySequence(Qt::CTRL + Qt::Key_O), this);//绑定了“Ctrl+O”为打开文件
connect(on_openButton_clickedShortcut, &QShortcut::activated, this, &Widget::on_openButton_clicked);
QShortcut *on_saveButton_clickedShortcut = new QShortcut(QKeySequence(Qt::CTRL + Qt::Key_S), this);//绑定了“Ctrl+S”为保存文件
connect(on_saveButton_clickedShortcut, &QShortcut::activated, this, &Widget::on_saveButton_clicked);
QShortcut *on_closeButton_clickedShortcut = new QShortcut(QKeySequence(Qt::CTRL + Qt::Key_C), this);//绑定了“Ctrl+C”为关闭文件
connect(on_closeButton_clickedShortcut, &QShortcut::activated, this, &Widget::on_closeButton_clicked);
5、显示当前光标位置
5.1 关联代码
connect(ui->textEdit,SIGNAL(cursorPositionChanged()),this,SLOT(onCursorPositionChanged()));//cursorPositionChanged()这是一个属于textEdit控件的事件,
//在UI界面转到槽中可以看到
5.2 槽函数
void Widget::onCursorPositionChanged()
{
QTextCursor cursor = ui->textEdit->textCursor();
//qDebug() << cursor.blockNumber()+1 <<","<< cursor.columnNumber() + 1;
QString blockNum = QString::number(cursor.blockNumber()+1);
QString columnNum = QString::number(cursor.columnNumber()+1);
const QString labelMes = "L:"+blockNum+",C:"+columnNum+" ";
//const QString labelMes = "行:"+blockNum+",列:"+columnNum+" ";
ui->PositionLable->setText(labelMes);
//设置当前行高亮
QList<QTextEdit::ExtraSelection> extraSelections;
QTextEdit::ExtraSelection ext;
//1. 知道当前行
ext.cursor = cursor;
QBrush qBrush(Qt::lightGray);
//2. 颜色
ext.format.setBackground(qBrush);
//配置段属性:整行显示,没有这句话不行
ext.format.setProperty(QTextFormat::FullWidthSelection, true);
//ext.format.setFontUnderline(true);
//3. 设置
//把ext加到ext的容器中
extraSelections.append(ext);
ui->textEdit->setExtraSelections(extraSelections);
}
6、字符编码格式的选择
6.1 源码展示
qDebug() << "currentIndexChanged:" << index;
// 清空textEdit的内容
ui->textEdit->clear();
// 如果文件名没有设置,则退出
if (fileName.isEmpty()) {
qDebug() << "File name is not set.";
return;
}
// 如果文件已经打开,先关闭文件
if (file.isOpen()) {
file.close();
}
// 获取当前选中的编码格式
QString codecName = ui->comboBox->currentText();
// 尝试打开文件
file.setFileName(fileName);
if (!file.open(QIODevice::ReadOnly | QIODevice::Text)) {
qDebug() << "file open error";
return;
}
// 设置QTextStream使用的字符编码
QTextStream in(&file);
in.setCodec(codecName.toUtf8().constData());
// 将文件指针移至文件开头
file.seek(0);
// 读取文件内容
while (!in.atEnd()) {
QString line = in.readLine();
ui->textEdit->append(line);
}
// 关闭文件
file.close();
7、widget.h文件
#ifndef WIDGET_H
#define WIDGET_H
#include <QWidget>
#include <QString>
#include <QFile>
#include <qcombobox.h>
QT_BEGIN_NAMESPACE
namespace Ui { class Widget; }
QT_END_NAMESPACE
class Widget : public QWidget
{
Q_OBJECT
public:
Widget(QWidget *parent = nullptr);
~Widget();
void on_increaseFontSize();
void on_decreaseFontSize();
private slots:
void on_openButton_clicked();
void on_closeButton_clicked();
void on_saveButton_clicked();
void onCurrentIndexChanged(int index);
void onCursorPositionChanged();
private:
Ui::Widget *ui;
QString fileName; // 定义成员变量
QFile file;
};
#endif // WIDGET_H
五、源码文件
CSDN资源文件:打地基的小白的记事本https://download.csdn.net/download/weixin_54210362/89728197?spm=1001.2014.3001.5503百度网盘链接:
链接: https://pan.baidu.com/s/18ZFUBRDnGb0I3QzQwyMAPw 提取码: ugw9