本文用QT实现记事本功能。

一、成品展示

1.界面

主要元素:

        1.标题为MyNoteBook;

        2.相应图标为:打开文件,保存,退出;

        3.右下角标注光标所在行列,默认编码方式为UTF-8;

        4.鼠标所在图标位置时会有变暗,点击也有颜色响应。

2.打开文本

打开文本:

        1.打开文本后,标题会变为相关文件路径;

        2.显示文件内容;

        3.光标所在行列颜色变深;

        4.利用鼠标滚轮实现字体放大缩小功能。

3.保存文件

保存文件

        1.点击保存,输入文件名,保存。

4.关闭文件

关闭文件

        1.点击关闭,弹出如下,点击相关按键可实现保存,不保存,退出功能。

二、代码实现

1.字体放大缩小

void Widget::zoomIn()
{QFont font = ui->textEdit->font();int fontSize = font.pointSize();if(fontSize == -1) return; int newFontSize = fontSize + 1;font.setPointSize(newFontSize);ui->textEdit->setFont(font);
}void Widget::zoomOut()
{QFont font = ui->textEdit->font();int fontSize = font.pointSize();if(fontSize == -1) return;int newFontSize = fontSize - 1;font.setPointSize(newFontSize);ui->textEdit->setFont(font);
}
// 事件过滤器,用于处理滚轮事件
bool Widget::eventFilter(QObject *watched, QEvent *event)
{if(event->type() == QEvent::Wheel && QGuiApplication::keyboardModifiers() == Qt::ControlModifier){QWheelEvent *wheelEvent = dynamic_cast<QWheelEvent*>(event);if(wheelEvent->angleDelta().y() > 0){zoomIn(); }else if(wheelEvent->angleDelta().y() < 0){zoomOut(); }return true; }return false; }

2.打开文件

void Widget::on_btnFileOpen_clicked()
{QString fileName = QFileDialog::getOpenFileName(this, tr("Open File"), "D:/QT/", tr("Text (*.txt)"));ui->textEdit->clear();file.setFileName(fileName);if (!file.open(QIODevice::ReadOnly | QIODevice::Text)){QMessageBox::critical(this, tr("Error"), tr("Failed to open file: %1").arg(fileName));return;}this->setWindowTitle(fileName + "- MyNoteBook"); QTextStream in(&file);QString str = ui->comboBox->currentText();const char* c_str = str.toStdString().c_str();in.setCodec(c_str);while (!in.atEnd()){QString context = in.readLine();ui->textEdit->append(context);}file.close();
}

3.保存文件

void Widget::on_btnSave_clicked()
{if(!file.isOpen()){QString fileName = QFileDialog::getSaveFileName(this, tr("Save File"), "D:/QT/untitled.txt", tr("Text (*.txt *.doc)"));file.setFileName(fileName);if(!file.open(QIODevice::WriteOnly | QIODevice::Text | QIODevice::Truncate)){qDebug() << "file open error";}this->setWindowTitle(fileName + "- MyNoteBook"); }else {file.resize(0); }QTextStream out(&file);QString str = ui->comboBox->currentText();const char* c_str = str.toStdString().c_str();out.setCodec(c_str);QString context = ui->textEdit->toPlainText();out << context;
}

4.关闭文件

void Widget::on_btnClose_clicked()
{int ret = QMessageBox::warning(this, tr("MyNoteBook Notice:"), tr("The document has been modified.\nDo you want to save your changes?"), QMessageBox::Save | QMessageBox::Discard | QMessageBox::Cancel, QMessageBox::Save);switch (ret) {case QMessageBox::Save: on_btnSave_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;}
}

5.编码

void Widget::onCurrentIndexChanged(int index)
{qDebug() << "currentIndexChanged";ui->textEdit->clear(); // 清空TextEditif(file.isOpen()) { // 如果文件已打开qDebug() << "file is Open";// 使用QTextStream重读文件内容QTextStream in(&file);in.setCodec(ui->comboBox->currentText().toStdString().c_str());file.seek(0); while(!in.atEnd()) {QString context = in.readLine();ui->textEdit->append(context);}}
}

6.光标显示

void Widget::onCursorPositionChanged()
{QTextCursor cursor = ui->textEdit->textCursor();QString blockNum = QString::number(cursor.blockNumber() + 1);QString columnNum = QString::number(cursor.columnNumber() + 1);const QString labelMes = "L:" + blockNum + ",C:" + columnNum + "   ";ui->labelPosition->setText(labelMes); // 更新位置标签QList<QTextEdit::ExtraSelection> extraSelections;QTextEdit::ExtraSelection ext;ext.cursor = cursor;QBrush qBrush(Qt::lightGray);ext.format.setBackground(qBrush);ext.format.setProperty(QTextFormat::FullWidthSelection, true);extraSelections.append(ext);ui->textEdit->setExtraSelections(extraSelections);
}

三、剩余代码

构造析构函数:

Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget)
{ui->setupUi(this);ui->textEdit->installEventFilter(this);QShortcut *shortcutOpen = new QShortcut(QKeySequence(tr("Ctrl+O", "File|Open")), this);QShortcut *shortcutSave = new QShortcut(QKeySequence(tr("Ctrl+S", "File|Save")), this);QShortcut *shortcutZoomIn = new QShortcut(QKeySequence(tr("Ctrl+Shift+=", "File|Zoom In")), this); QShortcut *shortcutZoomOut = new QShortcut(QKeySequence(tr("Ctrl+Shift+-", "File|Zoom Out")), this); connect(shortcutOpen, &QShortcut::activated, [=](){on_btnFileOpen_clicked(); });connect(shortcutSave, &QShortcut::activated, [=](){on_btnSave_clicked(); });connect(shortcutZoomIn, &QShortcut::activated, [=](){zoomIn(); });connect(shortcutZoomOut, &QShortcut::activated, [=](){zoomOut(); });this->setLayout(ui->verticalLayout);connect(ui->comboBox, SIGNAL(currentIndexChanged(int)), this, SLOT(onCurrentIndexChanged(int)));connect(ui->textEdit, SIGNAL(cursorPositionChanged()), this, SLOT(onCursorPositionChanged()));
}Widget::~Widget()
{delete ui;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/news/918652.shtml
繁体地址,请注明出处:http://hk.pswp.cn/news/918652.shtml
英文地址,请注明出处:http://en.pswp.cn/news/918652.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【软件测试】性能测试 —— 工具篇 JMeter 介绍与使用

&#x1f970;&#x1f970;&#x1f970;来都来了&#xff0c;不妨点个关注叭&#xff01; &#x1f449;博客主页&#xff1a;欢迎各位大佬!&#x1f448; 文章目录1. JMeter 的介绍2. JMeter 安装、配置、搭建2.1 前置条件 —— Java环境搭建2.2 JMeter 下载2.3 JMeter 安装…

二十二、Mybatis-快速入门程序

入门程序大概步骤叙述&#xff1a; 步骤一&#xff1a;创建springboot工程并且数据库提前创建表步骤二&#xff1a;创建springboot工程对Mybatis相关依赖注意打勾步骤三&#xff1a;编写查找方法步骤四&#xff1a;编写测试方法项目目录结构与数据库以及代码&#xff1a; 项目目…

Blender模拟结构光3D Scanner(一)外参数匹配

如何使用Blender模拟FPP(Fringe Projection Profilometry) 原理的结构光3D传感器&#xff1f;主要包含的工作有&#xff1a;1&#xff09;相机、投影仪定位与内外参数匹配&#xff1b;2&#xff09;投影仪投射指定Pattern图像&#xff1b;3&#xff09;被测物体材质属性配置等&…

LangChain是如何实现RAG多轮问答的

目录引言一、LangChain实现RAG多轮问答核心机制1. 对话历史管理&#xff08;Memory&#xff09;2. 问题重写&#xff08;Query Rewriting&#xff09;3. 检索增强生成&#xff08;RAG Core&#xff09;4. 链式工作流&#xff08;Chain&#xff09;二、关键设计特点三、完整示例…

DAY 44 预训练模型

知识点回顾&#xff1a; 预训练的概念常见的分类预训练模型图像预训练模型的发展史预训练的策略预训练代码实战&#xff1a;resnet18 一、预训练的概念 我们之前在训练中发现&#xff0c;准确率最开始随着epoch的增加而增加。随着循环的更新&#xff0c;参数在不断发生更新。 所…

Java Stream API 中常用方法复习及项目实战示例

在最近的练手项目中&#xff0c;对于stream流的操作愈加频繁&#xff0c;我也越来越感觉stream流在处理数据是的干净利落&#xff0c;因此写博客用来记录最近常用的方法以便于未来的复习。map() 方法map()是一个中间操作&#xff08;intermediate operation&#xff09;&#x…

从零开始手搓一个GPT大语言模型:从理论到实践的完整指南(一)

现在人工智能飞速发展时代&#xff0c;LLM绝对可以算是人工智能领域得一颗明珠&#xff0c;也是现在许多AI项目落地得必不可少得一个模块&#xff0c;可以说&#xff0c;不管你之前得研究领域是AI得哪个方向&#xff0c;现在都需要会一些LLM基础&#xff0c;在这个系列&#xf…

Redis ubuntu下载Redis的C++客户端

1. 安装 redis-plus-plus C 操作 Redis 的库有很多&#xff0c;这里选择使用 redis-plus-plus&#xff0c;这个库的功能强大&#xff0c;使用简单。 Github 地址&#xff1a;GitHub - sewenew/redis-plus-plus: Redis client written in C 访问不了Github 地址的可以使用Ste…

nm命令和nm -D命令参数

出现这种差异的原因在于&#xff1a;动态库中的符号分为两种类型&#xff1a; 常规符号表&#xff08;regular symbol table&#xff09;&#xff1a;通常用于静态链接和调试&#xff0c;默认不包含在动态库中&#xff08;除非显式保留&#xff09;。动态符号表&#xff08;dyn…

Windows下cuda的安装和配置

今天开始做一个cuda教程。由于本人主要在windows下使用visual studio进行开发&#xff0c;因此这里讲一下windows下的cuda开发环境。 下载cuda_toolkit 从网站https://developer.nvidia.com/cuda-toolkit中下载&#xff0c;先选择Download Now,然后跳转到如下页面&#xff1a…

【代码随想录day 19】 力扣 450.删除二叉搜索树中的节点

视频讲解&#xff1a;https://www.bilibili.com/video/BV1tP41177us/?share_sourcecopy_web&vd_sourcea935eaede74a204ec74fd041b917810c 文档讲解&#xff1a;https://programmercarl.com/0450.%E5%88%A0%E9%99%A4%E4%BA%8C%E5%8F%89%E6%90%9C%E7%B4%A2%E6%A0%91%E4%B8%A…

智慧养老丨实用科普+避坑指南:科技如何让晚年生活更安全舒适?

随着老龄化社会的到来&#xff0c;智慧养老产品逐渐成为改善老年人生活质量的重要工具。从智能手表到便携洗浴机&#xff0c;科技正为老年人的健康、安全与生活便利提供创新解决方案。我们这次主要介绍四类典型智慧养老产品&#xff0c;结合真实体验给出选购建议&#xff0c;并…

系统垃圾清理批处理脚本 (BAT)

系统垃圾清理批处理脚本 (BAT) 以下是一个Windows系统垃圾清理的批处理脚本&#xff0c;它可以清理常见的系统临时文件、缓存和日志等&#xff1a; echo off title 系统垃圾清理工具 color 0a echo. echo 正在清理系统垃圾文件&#xff0c;请稍候... echo.:: 清理临时文件 echo…

Terraform的零基础学习教程

一、Terraform 是什么&#xff1f; Terraform 是由 HashiCorp 开发的开源工具&#xff0c;用于自动化管理云基础设施&#xff08;如 AWS、Azure、GCP 等&#xff09;。 核心特点&#xff1a; 基础设施即代码&#xff08;IaC&#xff09;&#xff1a;用代码定义和管理资源。跨…

429. N 叉树的层序遍历(中等)题解

题目描述给定一个 N 叉树&#xff0c;返回其节点值的层序遍历。&#xff08;即从左到右&#xff0c;逐层遍历&#xff09;。树的序列化输入是用层序遍历&#xff0c;每组子节点都由 null 值分隔&#xff08;参见示例&#xff09;。示例 1&#xff1a;输入&#xff1a;root [1,…

Java 课程,每天解读一个简单Java之题目:输入一行字符,分别统计出其中英文字母、空格、数字和其它字符的个数。

package ytr250813;import java.io.IOException;public class CharacterCounter {public static void main(String[] args) throws IOException {// 初始化计数器变量int letterCount 0; // 英文字母计数器int spaceCount 0; // 空格计数器int digitCount 0; // 数字计数器i…

GitLab CI + Docker 自动构建前端项目并部署 — 完整流程文档

一、环境准备1. 服务器准备一台Linux服务器&#xff08;CentOS/Ubuntu皆可&#xff09;&#xff0c;推荐至少4核8GB内存已安装 Docker&#xff08;及 Docker 服务已启动&#xff09;已安装 GitLab Runner2. 服务器上安装 Docker &#xff08;如果没装&#xff09;# CentOS9以下…

LCP 17. 速算机器人

目录 题目链接&#xff1a; 题目&#xff1a; 解题思路&#xff1a; 代码&#xff1a; 总结&#xff1a; 题目链接&#xff1a; LCP 17. 速算机器人 - 力扣&#xff08;LeetCode&#xff09; 题目&#xff1a; # LCP 17. 速算机器人 小扣在秋日市集发现了一款速算机器人。…

Spring cloud集成ElastictJob分布式定时任务完整攻略(含snakeyaml报错处理方法)

ElasticJob 是一款轻量级、可扩展的分布式定时任务解决方案&#xff0c;基于 Quartz 二次开发&#xff0c;支持任务分片、失效转移、任务追踪等功能&#xff0c;非常适合在 Spring Cloud 微服务场景中使用。我将带你完成 Spring Cloud 集成 ElasticJob 的全过程&#xff0c;并分…

了解 Linux 中的 /usr 目录以及 bin、sbin 和 lib 的演变

Linux 文件系统层次结构是一个复杂且引人入胜的体系&#xff0c;其根源深植于类 Unix 操作系统的历史之中。在这一结构的核心&#xff0c;/usr 目录是一个至关重要的组成部分&#xff0c;随着时间的推移&#xff0c;它经历了显著的演变。与此同时&#xff0c;/bin、/sbin、/lib…