当前位置: 首页 > article >正文

P3 QT项目----记事本(3.8)

3.8 记事本项目总结

项目源码

1.main.cpp

#include "widget.h"
#include <QApplication>
int main(int argc, char *argv[])
{QApplication a(argc, argv);Widget w;w.show();return a.exec();
}

2.widget.cpp

#include "widget.h"
#include "ui_widget.h"
#include <QFileDialog>
#include <QDebug>
#include <QList>
#include <QMessageBox>
#include <QShortcut>
Widget::Widget(QWidget *parent) : QWidget(parent), ui(new Ui::Widget)
{ //建立快捷键  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|Save")),this);  //字体放大QShortcut *shortcutZoomOut = new QShortcut(QKeySequence(tr("Ctrl+Shift+-", "File|Save")),this); //字体缩小//Lambda表达式connect(shortcutOpen,&QShortcut::activated,[=](){ on_btnOpen_clicked(); }); connect(shortcutSave,&QShortcut::activated,[=](){on_btnSave_clicked();});connect(shortcutZoomIn,&QShortcut::activated,[=](){      ZoomIn();  });connect(shortcutZoomOut,&QShortcut::activated,[=](){ZoomOut();}); //进行widget与ui的窗口关联,里面布局不会随窗口变化而变化ui->setupUi(this); //下面这行代码进行显示说明,窗口变化时,布局及其子控件随之调整this->setLayout(ui->verticalLayout);ui->widgetButtom->setLayout(ui->horizontalLayout_3); //信号与槽:编码选择 QObject::connect(ui->comboBox,SIGNAL(currentIndexChanged(int)),this,SLOT(onCurrentIndexChanged(int)));   //信号与槽:光标位置QObject::connect(ui->textEdit,SIGNAL(cursorPositionChanged()),this,SLOT(onCursorPositionChanged()));
}
Widget::~Widget()
{delete ui;
}/* 快捷键字体变大 QApplication类*/
void Widget::ZoomIn()
{//获得TextEdit的当前字体信息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()
{//获得TextEdit的当前字体信息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::on_btnOpen_clicked()
{//建立一个qfiledialog实例化QFileDialog qFileDialog;//设置对话框为打开文件模式qFileDialog.setFileMode(QFileDialog::ExistingFiles);//设置文件过滤器qFileDialog.selectNameFilter("Text files(*.txt*.doc) ");//打开文本框if(qFileDialog.exec()){//获取用户选择的文件列表QStringList fileName = qFileDialog.selectedFiles();//遍历列表并处理文件for(QString str : fileName){//输出文件名qDebug() << str;//清除文本编辑内容ui->textEdit->clear();//打开文件名file.setFileName(str);//判断是否成功打开文件if(!file.open(QIODevice::ReadWrite | QIODevice::Text)){qDebug() << "File Open Error!";}//标题文件名//this->setWindowTitle(fileName + "My NoyeBooks");//多态QTextStream in(&file);//读取方式//in.setCodec("UTF-8");//QString string = ui->comboBox->currentText();                     // 从下拉框获取当前选中的字符编码            // const char * c_str = string.toStdString().c_str();
//            in.setCodec(c_str);               //QString转为const char*型            in.setCodec(ui->comboBox->currentText().toStdString().c_str());     // 设置 QTextStream 的字符编码           //按行显示显示文件内容while (!file.atEnd()){QString context = in.readLine();ui->textEdit->append(context);}}}
}/* 保存按键 */
void Widget::on_btnSave_clicked()
{if(!file.isOpen())  //有打开的文件直接保存,不需要生成新文件{QString fileName = QFileDialog::getSaveFileName(this, tr("Save File"),                                                        
"D:/Embedded_learning/03.QT_Codeinlesson/build-P3-1-notebook/untitled.txt",                                                        tr("Text files(*.txt*.doc)")); qDebug() << fileName; file.setFileName(fileName); if(!file.open(QIODevice::WriteOnly | QIODevice::Text)){ qDebug() << "File Save Error!";}//标题文件名this->setWindowTitle(fileName + "-My NoyeBooks");}//写入的内容QTextStream out(&file);//out.setCodec("UTF-8");out.setCodec(ui->comboBox->currentText().toStdString().c_str());    //QString转为const char*型QString context = ui->textEdit->toPlainText();//输入out << context;
}/* 关闭按键 */
void Widget::on_btnClose_clicked()
{ui->textEdit->clear();//未保存文件按下关闭按键时,会触发警告int ret = QMessageBox::warning(this, tr("My NoyeBooks"),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:  //保存// Save was clickedon_btnSave_clicked();qDebug() << "QMessageBox::Save:";break;case QMessageBox::Discard:   //丢弃// Don't Save was clickedui->textEdit->clear();if(file.isOpen()){file.close();this->setWindowTitle("My NoyeBooks");}qDebug() << "QMessageBox::Discard:";break;case QMessageBox::Cancel:qDebug() << "QMessageBox::Cancel:";// Cancel was clickedbreak;default:// should never be reachedbreak;}//检测设备是否打开,打开返回trueif(file.isOpen()){file.close();this->setWindowTitle("My NoyeBooks");}
}/* 解决乱码问题combobox */
void Widget::onCurrentIndexChanged(int index)
{//清除文本ui->textEdit->clear();//检测设备是否打开,打开返回trueif(file.isOpen()){// 创建 QTextStream 用于读取文件内容QTextStream in(&file);in.setCodec(ui->comboBox->currentText().toStdString().c_str());//光标回到初始位置file.seek(0);//继续显示文件内容while (!file.atEnd())   {  QString context = in.readLine();  ui->textEdit->append(context); }}
}
/* 光标位置 */
void Widget::onCursorPositionChanged()
{QTextCursor cursor = ui->textEdit->textCursor();//qDebug() << cursor.blockNumber() + 1 << "," << cursor.columnNumber() + 1;//行QString blockNum = QString::number(cursor.blockNumber() + 1);//列QString columNum = QString::number(cursor.columnNumber() + 1);const QString labelMes = "L:" + blockNum + ",C:" + columNum + "     ";ui->labelPosition->setText(labelMes);  //设置当前行高亮 QList<QTextEdit::ExtraSelection> extraSelection;    //定义qLish集合  QTextEdit::ExtraSelection ext;                      //qLish的一个对象   //1.知道当前行  ext.cursor = ui->textEdit->textCursor(); //2.颜色 QBrush qBrush(Qt::yellow); ext.format.setBackground(qBrush); ext.format.setProperty(QTextFormat::FullWidthSelection,true);   //配置段属性,需要整行设置,没有这行不行 //3.设置extraSelection.append(ext); //把ext加入到ext容器中ui->textEdit->setExtraSelections(extraSelection);
}

3.widget.h

#ifndef WIDGET_H
#define WIDGET_H
#include <QWidget>
#include <QFile>
QT_BEGIN_NAMESPACE
namespace Ui { class Widget; }
QT_END_NAMESPACE
class Widget : public QWidget
{Q_OBJECT
public:Widget(QWidget *parent = nullptr);~Widget();QFile file;void ZoomIn();void ZoomOut();
private slots:void on_btnOpen_clicked();void on_btnSave_clicked();void on_btnClose_clicked();void onCurrentIndexChanged(int index);void onCursorPositionChanged();
private:Ui::Widget *ui;
};#endif // WIDGET_H
4.testedit.cpp
#include "testedit.h"
/*将QTestEdit提升为testedit的ui界面,经事件处理,完成记事本可以通过鼠标滚轮和Ctrl键进行文本放大缩小
*/
#include <QWheelEvent>
#include <QDebug>testedit::testedit(QWidget *parent) : QTextEdit(parent)
{
}void testedit::wheelEvent(QWheelEvent *e)
{qDebug() << e->angleDelta().y();if(ctrlKeyPressed == 1){if(e->angleDelta().y() > 0){//放大zoomIn();}else if (e->angleDelta().y() < 0){zoomOut();}e->accept();}else{QTextEdit::wheelEvent(e);}
}void testedit::keyPressEvent(QKeyEvent *e)
{if(e->key() == Qt::Key_Control){qDebug() << "Ctrl is Pressed";ctrlKeyPressed = 1;}QTextEdit::keyPressEvent(e);
}void testedit::keyReleaseEvent(QKeyEvent *e)
{if(e->key() == Qt::Key_Control){qDebug() << "Ctrl is Released";ctrlKeyPressed = 0;} QTextEdit::keyReleaseEvent(e);
}

5.testedit.h

#ifndef TESTEDIT_H
#define TESTEDIT_H
#include <QTextEdit>
class testedit : public QTextEdit
{
public:testedit(QWidget *parent);
protected:void wheelEvent(QWheelEvent *e) override;void keyPressEvent(QKeyEvent *e) override;void keyReleaseEvent(QKeyEvent *e) override;
private:bool ctrlKeyPressed = 0;
};#endif // TESTEDIT_H

相关文章:

P3 QT项目----记事本(3.8)

3.8 记事本项目总结 项目源码 1.main.cpp #include "widget.h" #include <QApplication> int main(int argc, char *argv[]) {QApplication a(argc, argv);Widget w;w.show();return a.exec(); } 2.widget.cpp #include "widget.h" #include &q…...

ffmpeg(四):滤镜命令

FFmpeg 的滤镜命令是用于音视频处理中的强大工具&#xff0c;可以完成剪裁、缩放、加水印、调色、合成、旋转、模糊、叠加字幕等复杂的操作。其核心语法格式一般如下&#xff1a; ffmpeg -i input.mp4 -vf "滤镜参数" output.mp4或者带音频滤镜&#xff1a; ffmpeg…...

第25节 Node.js 断言测试

Node.js的assert模块主要用于编写程序的单元测试时使用&#xff0c;通过断言可以提早发现和排查出错误。 稳定性: 5 - 锁定 这个模块可用于应用的单元测试&#xff0c;通过 require(assert) 可以使用这个模块。 assert.fail(actual, expected, message, operator) 使用参数…...

Cinnamon修改面板小工具图标

Cinnamon开始菜单-CSDN博客 设置模块都是做好的&#xff0c;比GNOME简单得多&#xff01; 在 applet.js 里增加 const Settings imports.ui.settings;this.settings new Settings.AppletSettings(this, HTYMenusonichy, instance_id); this.settings.bind(menu-icon, menu…...

【论文笔记】若干矿井粉尘检测算法概述

总的来说&#xff0c;传统机器学习、传统机器学习与深度学习的结合、LSTM等算法所需要的数据集来源于矿井传感器测量的粉尘浓度&#xff0c;通过建立回归模型来预测未来矿井的粉尘浓度。传统机器学习算法性能易受数据中极端值的影响。YOLO等计算机视觉算法所需要的数据集来源于…...

华为OD机试-食堂供餐-二分法

import java.util.Arrays; import java.util.Scanner;public class DemoTest3 {public static void main(String[] args) {Scanner in new Scanner(System.in);// 注意 hasNext 和 hasNextLine 的区别while (in.hasNextLine()) { // 注意 while 处理多个 caseint a in.nextIn…...

生成 Git SSH 证书

&#x1f511; 1. ​​生成 SSH 密钥对​​ 在终端&#xff08;Windows 使用 Git Bash&#xff0c;Mac/Linux 使用 Terminal&#xff09;执行命令&#xff1a; ssh-keygen -t rsa -b 4096 -C "your_emailexample.com" ​​参数说明​​&#xff1a; -t rsa&#x…...

【算法训练营Day07】字符串part1

文章目录 反转字符串反转字符串II替换数字 反转字符串 题目链接&#xff1a;344. 反转字符串 双指针法&#xff0c;两个指针的元素直接调转即可 class Solution {public void reverseString(char[] s) {int head 0;int end s.length - 1;while(head < end) {char temp …...

跨链模式:多链互操作架构与性能扩展方案

跨链模式&#xff1a;多链互操作架构与性能扩展方案 ——构建下一代区块链互联网的技术基石 一、跨链架构的核心范式演进 1. 分层协议栈&#xff1a;模块化解耦设计 现代跨链系统采用分层协议栈实现灵活扩展&#xff08;H2Cross架构&#xff09;&#xff1a; 适配层&#xf…...

镜像里切换为普通用户

如果你登录远程虚拟机默认就是 root 用户&#xff0c;但你不希望用 root 权限运行 ns-3&#xff08;这是对的&#xff0c;ns3 工具会拒绝 root&#xff09;&#xff0c;你可以按以下方法创建一个 非 root 用户账号 并切换到它运行 ns-3。 一次性解决方案&#xff1a;创建非 roo…...

MODBUS TCP转CANopen 技术赋能高效协同作业

在现代工业自动化领域&#xff0c;MODBUS TCP和CANopen两种通讯协议因其稳定性和高效性被广泛应用于各种设备和系统中。而随着科技的不断进步&#xff0c;这两种通讯协议也正在被逐步融合&#xff0c;形成了一种新型的通讯方式——开疆智能MODBUS TCP转CANopen网关KJ-TCPC-CANP…...

spring:实例工厂方法获取bean

spring处理使用静态工厂方法获取bean实例&#xff0c;也可以通过实例工厂方法获取bean实例。 实例工厂方法步骤如下&#xff1a; 定义实例工厂类&#xff08;Java代码&#xff09;&#xff0c;定义实例工厂&#xff08;xml&#xff09;&#xff0c;定义调用实例工厂&#xff…...

Keil 中设置 STM32 Flash 和 RAM 地址详解

文章目录 Keil 中设置 STM32 Flash 和 RAM 地址详解一、Flash 和 RAM 配置界面(Target 选项卡)1. IROM1(用于配置 Flash)2. IRAM1(用于配置 RAM)二、链接器设置界面(Linker 选项卡)1. 勾选“Use Memory Layout from Target Dialog”2. 查看链接器参数(如果没有勾选上面…...

如何将联系人从 iPhone 转移到 Android

从 iPhone 换到 Android 手机时&#xff0c;你可能需要保留重要的数据&#xff0c;例如通讯录。好在&#xff0c;将通讯录从 iPhone 转移到 Android 手机非常简单&#xff0c;你可以从本文中学习 6 种可靠的方法&#xff0c;确保随时保持连接&#xff0c;不错过任何信息。 第 1…...

苍穹外卖--缓存菜品

1.问题说明 用户端小程序展示的菜品数据都是通过查询数据库获得&#xff0c;如果用户端访问量比较大&#xff0c;数据库访问压力随之增大 2.实现思路 通过Redis来缓存菜品数据&#xff0c;减少数据库查询操作。 缓存逻辑分析&#xff1a; ①每个分类下的菜品保持一份缓存数据…...

Qt Http Server模块功能及架构

Qt Http Server 是 Qt 6.0 中引入的一个新模块&#xff0c;它提供了一个轻量级的 HTTP 服务器实现&#xff0c;主要用于构建基于 HTTP 的应用程序和服务。 功能介绍&#xff1a; 主要功能 HTTP服务器功能&#xff1a; 支持 HTTP/1.1 协议 简单的请求/响应处理模型 支持 GET…...

Python爬虫(二):爬虫完整流程

爬虫完整流程详解&#xff08;7大核心步骤实战技巧&#xff09; 一、爬虫完整工作流程 以下是爬虫开发的完整流程&#xff0c;我将结合具体技术点和实战经验展开说明&#xff1a; 1. 目标分析与前期准备 网站技术分析&#xff1a; 使用浏览器开发者工具&#xff08;F12&…...

Nginx server_name 配置说明

Nginx 是一个高性能的反向代理和负载均衡服务器&#xff0c;其核心配置之一是 server 块中的 server_name 指令。server_name 决定了 Nginx 如何根据客户端请求的 Host 头匹配对应的虚拟主机&#xff08;Virtual Host&#xff09;。 1. 简介 Nginx 使用 server_name 指令来确定…...

Java-41 深入浅出 Spring - 声明式事务的支持 事务配置 XML模式 XML+注解模式

点一下关注吧&#xff01;&#xff01;&#xff01;非常感谢&#xff01;&#xff01;持续更新&#xff01;&#xff01;&#xff01; &#x1f680; AI篇持续更新中&#xff01;&#xff08;长期更新&#xff09; 目前2025年06月05日更新到&#xff1a; AI炼丹日志-28 - Aud…...

【Go】3、Go语言进阶与依赖管理

前言 本系列文章参考自稀土掘金上的 【字节内部课】公开课&#xff0c;做自我学习总结整理。 Go语言并发编程 Go语言原生支持并发编程&#xff0c;它的核心机制是 Goroutine 协程、Channel 通道&#xff0c;并基于CSP&#xff08;Communicating Sequential Processes&#xff0…...

鸿蒙中用HarmonyOS SDK应用服务 HarmonyOS5开发一个医院查看报告小程序

一、开发环境准备 ​​工具安装​​&#xff1a; 下载安装DevEco Studio 4.0&#xff08;支持HarmonyOS 5&#xff09;配置HarmonyOS SDK 5.0确保Node.js版本≥14 ​​项目初始化​​&#xff1a; ohpm init harmony/hospital-report-app 二、核心功能模块实现 1. 报告列表…...

【2025年】解决Burpsuite抓不到https包的问题

环境&#xff1a;windows11 burpsuite:2025.5 在抓取https网站时&#xff0c;burpsuite抓取不到https数据包&#xff0c;只显示&#xff1a; 解决该问题只需如下三个步骤&#xff1a; 1、浏览器中访问 http://burp 2、下载 CA certificate 证书 3、在设置--隐私与安全--…...

[10-3]软件I2C读写MPU6050 江协科技学习笔记(16个知识点)

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16...

DIY|Mac 搭建 ESP-IDF 开发环境及编译小智 AI

前一阵子在百度 AI 开发者大会上&#xff0c;看到基于小智 AI DIY 玩具的演示&#xff0c;感觉有点意思&#xff0c;想着自己也来试试。 如果只是想烧录现成的固件&#xff0c;乐鑫官方除了提供了 Windows 版本的 Flash 下载工具 之外&#xff0c;还提供了基于网页版的 ESP LA…...

学习STC51单片机31(芯片为STC89C52RCRC)OLED显示屏1

每日一言 生活的美好&#xff0c;总是藏在那些你咬牙坚持的日子里。 硬件&#xff1a;OLED 以后要用到OLED的时候找到这个文件 OLED的设备地址 SSD1306"SSD" 是品牌缩写&#xff0c;"1306" 是产品编号。 驱动 OLED 屏幕的 IIC 总线数据传输格式 示意图 …...

C++ 基础特性深度解析

目录 引言 一、命名空间&#xff08;namespace&#xff09; C 中的命名空间​ 与 C 语言的对比​ 二、缺省参数​ C 中的缺省参数​ 与 C 语言的对比​ 三、引用&#xff08;reference&#xff09;​ C 中的引用​ 与 C 语言的对比​ 四、inline&#xff08;内联函数…...

视频字幕质量评估的大规模细粒度基准

大家读完觉得有帮助记得关注和点赞&#xff01;&#xff01;&#xff01; 摘要 视频字幕在文本到视频生成任务中起着至关重要的作用&#xff0c;因为它们的质量直接影响所生成视频的语义连贯性和视觉保真度。尽管大型视觉-语言模型&#xff08;VLMs&#xff09;在字幕生成方面…...

python爬虫:Newspaper3k 的详细使用(好用的新闻网站文章抓取和解析的Python库)

更多内容请见: 爬虫和逆向教程-专栏介绍和目录 文章目录 一、Newspaper3k 概述1.1 Newspaper3k 介绍1.2 主要功能1.3 典型应用场景1.4 安装二、基本用法2.2 提取单篇文章的内容2.2 处理多篇文档三、高级选项3.1 自定义配置3.2 分析文章情感四、实战案例4.1 构建新闻摘要聚合器…...

数据链路层的主要功能是什么

数据链路层&#xff08;OSI模型第2层&#xff09;的核心功能是在相邻网络节点&#xff08;如交换机、主机&#xff09;间提供可靠的数据帧传输服务&#xff0c;主要职责包括&#xff1a; &#x1f511; 核心功能详解&#xff1a; 帧封装与解封装 封装&#xff1a; 将网络层下发…...

SpringBoot+uniapp 的 Champion 俱乐部微信小程序设计与实现,论文初版实现

摘要 本论文旨在设计并实现基于 SpringBoot 和 uniapp 的 Champion 俱乐部微信小程序&#xff0c;以满足俱乐部线上活动推广、会员管理、社交互动等需求。通过 SpringBoot 搭建后端服务&#xff0c;提供稳定高效的数据处理与业务逻辑支持&#xff1b;利用 uniapp 实现跨平台前…...