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

[QT]记事本项目(信号槽,QT基础控件,QT文件操作,QT关键类,对话框,事件)

一.UI界面搭建

(ui界面使用,界面布局,各控件介绍,界面大小调整)
在这里插入图片描述
在这里插入图片描述

二.信号槽机制实现文件的打开,保存,退出

(信号槽,QFile文件类,QTextStream类,QFileDialog文件对话框,QMessage消息对话框)

//实现功能 : 打开目标文件,按照右下角ComboBox所选编码格式打开
void Widget::on_btnopen_clicked()
{//文件内容显示到编辑栏中QString filename = QFileDialog::getOpenFileName(this,"打开文件","C:\\Users\\SlanderMC\\Desktop");file.setFileName(filename);file.open(QIODevice::ReadWrite|QIODevice::Text);this->setWindowTitle(filename+"----记事本");QTextStream stream(&file);switch (ui->comboBox->currentIndex()) {case 0:stream.setEncoding(QStringConverter::Utf8);break;case 1:stream.setEncoding(QStringConverter::Utf16);break;case 2:stream.setEncoding(QStringConverter::Utf32);break;case 3:stream.setEncoding(QStringConverter::Utf32BE);break;}QString str = stream.readAll();ui->textEdit->setText(str);ui->fontsizelabel->setText(QString("%1 px").arg(ui->textEdit->font().pointSize()));
}//实现功能 : 若已打开文件,直接保存内容到当前文件  若未打开,则用户选择路径进行保存
void Widget::on_btnsave_clicked()
{//编辑后的内容保存到文件if(!file.isOpen()){QString strsave = QFileDialog::getSaveFileName(this,"保存文件","C:\\Users\\SlanderMC\\Desktop");file.setFileName(strsave);file.open(QIODevice::WriteOnly|QIODevice::Text);this->setWindowTitle(strsave+"----记事本");}QTextStream stream(&file);//按照当前的编码格式写入switch (ui->comboBox->currentIndex()) {case 0:stream.setEncoding(QStringConverter::Utf8);break;case 1:stream.setEncoding(QStringConverter::Utf16);break;case 2:stream.setEncoding(QStringConverter::Utf32);break;case 3:stream.setEncoding(QStringConverter::Utf32BE);break;}stream.seek(0);stream<<ui->textEdit->toPlainText();}//实现功能 : 使用消息对话框,判断用户是否保存
//保存,丢弃(断开连接,置空文本框),退出
void Widget::on_btnclose_clicked()
{int res = QMessageBox::warning(this,"提示","您想要保存吗?",QMessageBox::Save|QMessageBox::Discard|QMessageBox::Cancel);switch (res) {case QMessageBox::Save:on_btnsave_clicked();break;case QMessageBox::Discard:ui->textEdit->clear();if(file.isOpen()){file.close();this->setWindowTitle("记事本");}break;case QMessageBox::Cancel://不做处理break;}
}

三.实现文件切换编码格式功能

(QTextStream类,comboBox选择框控件)
在这里插入图片描述

//实现功能 : 实施切换当前文件读取的编码格式
void Widget::on_comboBox_currentIndexChanged(int index)
{if(file.isOpen()){int index = ui->comboBox->currentIndex();QTextStream stream(&file);switch (index) {case 0:stream.setEncoding(QStringConverter::Utf8);break;case 1:stream.setEncoding(QStringConverter::Utf16);break;case 2:stream.setEncoding(QStringConverter::Utf32);break;case 3:stream.setEncoding(QStringConverter::Utf32BE);break;}//seek切换文件光标位置stream.seek(0);ui->textEdit->setText(stream.readAll());}
}

四.实现鼠标当前所在行高亮的功能,并在右下角显示行列

(textEdit标准控件,ExtraSelection类(包括cursor和QTextCharFormat两个成员))
在这里插入图片描述

//TextEdit的光标移动信号 “cursorPositionChanged”  对应的槽函数 "on_textEdit_cursorPositionChanged"
//--------实现功能 : 根据光标位置在右下角显示行列
void Widget::on_textEdit_cursorPositionChanged()
{//textCursor光标类,返回一个可视光标QTextCursor tc = ui->textEdit->textCursor();//获取行列int block = tc.blockNumber()+1;int column = tc.columnNumber()+1;//字符串拼接,标签更改QString str = QString("第%1行,第%2列").arg(block).arg(column);ui->labelhl->setText(str);//QTextEdit::ExtraSelection 是一个在 QTextEdit 中用来表示额外的文本选择和高亮的结构。//设置当前行高亮QList<QTextEdit::ExtraSelection> extralist;//ExtraSelection结构体包括两个成员  QTextCursor 和 QTextCharFormatQTextEdit::ExtraSelection extra;//QTextCursor 表示在文本中的一个位置或者区间,而extra.cursor = tc;//QTextCharFormat 用于定义这个区间的格式,比如背景颜色、字体,下划线等。QTextCharFormat f;f.setBackground(QBrush(Qt::lightGray));f.setFontUnderline(true);f.setUnderlineColor(Qt::white);f.setUnderlineStyle(QTextCharFormat::WaveUnderline);//配置整行显示,否则无效f.setProperty(QTextFormat::FullWidthSelection,true);extra.format = f;extralist.append(extra);ui->textEdit->setExtraSelections(extralist);}

五.实现Ctrl+O打开,Ctrl+S保存等快捷键功能

(QShortCut类,QKeySequence类,lambda表达式实现信号槽)

Widget::Widget(QWidget *parent) : QWidget(parent), ui(new Ui::Widget)
{ui->setupUi(this);ui->textEdit->installEventFilter(this);this->setWindowIcon(QIcon(":/resourse/open2.png"));this->setWindowTitle("记事本");this->setLayout(ui->verticalLayout);  //整体Widget垂直布局//快捷键  QT提供的QShortcut类// 并将其快捷键序列设置为 "Ctrl+N"实现的。//QKeySequence用以设置快捷键//绑定其activated信号连接到一个槽函数QShortcut *cutopen = new QShortcut(QKeySequence("Ctrl+O"),this);QShortcut *cutsave = new QShortcut(QKeySequence("Ctrl+S"),this);connect(cutopen,&QShortcut::activated,[=](){this->on_btnopen_clicked();});connect(cutsave,&QShortcut::activated,[=](){this->on_btnsave_clicked();});
}

六.实现字体放大缩小功能,实时显示 (快捷键实现)

在这里插入图片描述

void Widget::fontsizeup()
{QFont font =  ui->textEdit->font();font.setPointSize(font.pointSize()+1);ui->textEdit->setFont(font);ui->fontsizelabel->setText(QString("%1 px").arg(font.pointSize()));
}void Widget::fontsizedown()
{QFont font =  ui->textEdit->font();font.setPointSize(font.pointSize()-1);ui->textEdit->setFont(font);ui->fontsizelabel->setText(QString("%1 px").arg(font.pointSize()));
}
//设置快捷键,字体放大缩小QShortcut *cutsizeup   = new QShortcut(QKeySequence("Ctrl+="),this);QShortcut *cutsizedown = new QShortcut(QKeySequence("Ctrl+-"),this);connect(cutsizeup,&QShortcut::activated,[=](){fontsizeup();});connect(cutsizedown,&QShortcut::activated,[=](){fontsizedown();});

七.实现字体放大缩小功能(Ctrl+滚轮实现)

(QT事件,事件过滤器eventFilter,QEvent类及其子类,事件处理流程,事件处理函数重写)

①定义一个新的QTextEdit类,重写其事件处理函数,并将原本的QTextEdit提升为此类

头文件

#ifndef MYTEXTEDIT_H
#define MYTEXTEDIT_H#include <QTextEdit>
#include <QWidget>class mytextedit : public QTextEdit
{Q_OBJECT
public:explicit mytextedit(QWidget *parent = nullptr);void wheelEvent(QWheelEvent *e) override;void keyPressEvent(QKeyEvent *e)override;void keyReleaseEvent(QKeyEvent *e)override;
private:bool keyPress = false;
signals:};#endif // MYTEXTEDIT_H

源文件

#include "mytextedit.h"
#include<QDebug>
#include <QTextEdit>
#include <QWheelEvent>
mytextedit::mytextedit(QWidget *parent): QTextEdit{parent}
{}void mytextedit::wheelEvent(QWheelEvent *e)
{if(keyPress == true)  //按下Ctrl时,滑动滚轮切换字体大小{if(e->angleDelta().y()> 0 ){zoomIn();}else{zoomOut();}e->accept();}else   //没有摁下Ctrl时,默认调动滑块{QTextEdit::wheelEvent(e);}
}void mytextedit::keyPressEvent(QKeyEvent *e)
{if(e->key() == Qt::Key_Control)  //按下Ctrl{this->keyPress = true;}QTextEdit::keyPressEvent(e);
}void mytextedit::keyReleaseEvent(QKeyEvent *e)
{if(e->key() == Qt::Key_Control)  //按下Ctrl{this->keyPress = false;}QTextEdit::keyReleaseEvent(e);
}

②.重写事件过滤器

事件处理之前需要经过事件过滤处理,所以也可以在事件过滤函数中对某些事件进行拦截,比如这里的鼠标滚轮事件。
true表示事件处理完毕,不再向下分发,false表示事件继续向下分发。

事件过滤器需要安装在某个组件上,这里需要安装在Widget类下的TextEdit,所以过滤器定义在Widget下,并在TextEdit上进行安装。
在这里插入图片描述在这里插入图片描述
重写eventFilter

//先前对于事件的处理都是直接重写事件处理函数,此次借用 EventFilter事件过滤器来实现对于指定事件的处理
//事件发生->事件过滤->事件分发(分类)->事件处理
//在过滤阶段,处理逻辑写完后,不希望事件继续排放,返回true,表示事件已处理完毕。反之返回false,继续向下派发,由事件处理函数处理
bool Widget:: eventFilter(QObject *watched, QEvent *event)
{QKeyEvent *e = (QKeyEvent*)event;if(e->key() == Qt::Key_Control ){if(e->type() == QKeyEvent::KeyPress){qDebug()<<"key";this->isWheel = true;}else if(e->type() == QKeyEvent::KeyRelease){qDebug()<<"release";this->isWheel = false;}}QWheelEvent *e1 = (QWheelEvent*) event;if(e1->type() == QEvent::Wheel){if(this->isWheel){if(e1->angleDelta().y() >0){fontsizeup();}else if (e1->angleDelta().y() <0){fontsizedown();}return true;}else{return false;}}
}

相关文章:

[QT]记事本项目(信号槽,QT基础控件,QT文件操作,QT关键类,对话框,事件)

一.UI界面搭建 (ui界面使用&#xff0c;界面布局&#xff0c;各控件介绍&#xff0c;界面大小调整) 二.信号槽机制实现文件的打开&#xff0c;保存&#xff0c;退出 (信号槽&#xff0c;QFile文件类&#xff0c;QTextStream类&#xff0c;QFileDialog文件对话框&#xff0…...

redis基本数据结构-hash

这里写自定义目录标题 1. redis的数据结构hash1.1 Hash 数据结构的特点1.2 常见命令1.3 适用示例 2. 常见业务场景2.1 用户信息存储2.1.1 场景2.1.2 优势2.1.3 解决方案2.1.4 代码实现 2.2 购物车管理2.2.1 背景2.2.2 优势2.2.3 解决方案2.2.4 代码实现 3. 注意事项&#xff1a…...

21. 什么是MyBatis中的N+1问题?如何解决?

N1 问题是指在进行一对多查询时&#xff0c;应用程序首先执行一条查询语句获取结果集&#xff08;即 1&#xff09;&#xff0c;然后针对每一条结果&#xff0c;再执行 N 条额外的查询语句以获取关联数据。这个问题通常出现在 ORM 框架&#xff08;如 MyBatis 或 Hibernate&…...

天空卫士项目荣获“2024 IDC 中国20大杰出安全项目 ”奖项 ,实力见证安全守护

9月11日&#xff0c; IDC在上海圆满举办安全风险管控峰会&#xff0c;并现场官宣“2024 IDC中国20大杰出安全项目(CSO20) ”和“2024 IDC中国 CSO名人堂 (十大人物) ” 奖项名单。联通软研院申报的联通邮件系统安全合规建设项目被评为“2024 IDC中国20大杰出安全项目(CSO20) ”…...

Android生成Java AIDL

AIDL:Android Interface Definition Language AIDL是为了实现进程间通信而设计的Android接口语言 Android进程间通信有多种方式&#xff0c;Binder机制是其中最常见的一种 AIDL的本质就是基于对Binder的运用从而实现进程间通信 这篇博文从实战出发&#xff0c;用一个尽可能…...

嵌入式数据库sqlite和rocksdb的介绍以及对比

SQLite 和 RocksDB 都是非常流行的嵌入式数据库系统&#xff0c;但它们的设计理念和应用场景有所不同。下面是对这两个数据库系统的详细介绍以及它们之间的主要区别。 SQLite 简介 SQLite 是一个轻量级的关系数据库管理系统&#xff0c;完全由 C 语言编写而成。它以单一文件…...

数据结构之抽象数据类型(c语言版)

抽象数据类型的定义格式如下&#xff1a; ADT 抽象数据类型名{数据对象&#xff1a;<数据对象的定义>数据关系&#xff1a;<数据关系的定义>基本操作&#xff1a;<基本操作的定义> }ADT 抽象数据类型名 下面以复数为例给出完整的抽象数据类型的定义 ADT C…...

《ChatTTS一键安装详细教程》

ChatTTS 属于一种依托深度学习的文本转语音技术&#xff0c;能够把文本内容转换成自然且流畅&#xff0c;宛如真人发声的语音。ChatTTS 可以更出色地领会&#xff0c;理解文本所蕴含的情感、语调和语义&#xff0c;进而在语音输出时展现出更为精准和鲜活的各种情感。借助对大规…...

物联网之ESP32配网方式、蓝牙、WiFi

MENU 前言SmartConfig(智能配网)AP模式(Access Point模式)蓝牙配网Web Server模式WPS配网(Wi-Fi Protected Setup)Provisioning(配网服务)静态配置(硬编码)总结 前言 ESP32配网(Wi-Fi配置)的方式有多种&#xff0c;每种方式都有各自的优缺点。 根据具体项目需求&#xff0c;可以…...

golang 字符串浅析

go的字符串是只读的 测试源代码 package mainimport ("fmt""unsafe" )func swap(x, y string) (string, string) {return y, x }func print_string(obj *string, msg string) {string_ptr : (*[2]uintptr)(unsafe.Pointer(obj))first_obj_addr : string_…...

jantic/DeOldify部署(图片上色)附带Dockerfile和镜像

1. 克隆代码到DeOldify git clone https://github.com/jantic/DeOldify.git DeOldifyDeOldify源码 2. 安装依赖 这里会安装python以及创建deoldify环境 cd DeOldify conda env create -f environment.yml(base) rootDESKTOP-1FOD6A8:~/DeOldify# conda env create -f environm…...

2024年9月9日--9月15日(freex源码抄写+ue5肉鸽视频一节调节)

现在以工作为中心&#xff0c;其他可以不做硬性要求。周一到周四&#xff0c;晚上每天300行freex源码抄写&#xff0c;周六日每天1000行。每周3200行&#xff0c;每天完成该完成的即可&#xff0c;早上有时间时进行一小节独立游戏相关的视频教程作为调节即可&#xff0c;不影响…...

CLIP官方github代码详解

系列文章目录 文章目录 系列文章目录一、Usage1、conda install --yes -c pytorch pytorch1.7.1 torchvision cudatoolkit11.02、代码3、 二、1、2、3、 三、1、2、3、 四、1、2、3、 五、1、2、3、 六、1、2、3、 七、1、2、3、 八、1、2、3、 一、Usage 1、conda install --…...

ElementUI 布局——行与列的灵活运用

ElementUI 布局——行与列的灵活运用 一 . 使用 Layout 组件1.1 注册路由1.2 使用 Layout 组件 二 . 行属性2.1 栅格的间隔2.2 自定义元素标签 三 . 列属性3.1 列的偏移3.2 列的移动 在现代网页设计中&#xff0c;布局是构建用户界面的基石。Element UI 框架通过其强大的 <e…...

Docker快速部署Apache Guacamole

Docker快速部署Apache Guacamole ,实现远程访问 git clone "https://github.com/boschkundendienst/guacamole-docker-compose.git" cd guacamole-docker-compose ./prepare.sh docker-compose up -dhttps://IP地址:8443/ 用户名:guacadmin 密码:guacadmin docker …...

C++学习笔记----7、使用类与对象获得高性能(一)---- 书写类(1)

1、表格处理程序示例 表格处理程序是一个二维的“细胞”网格&#xff0c;每个格子包含了一个数字或者字符串。专业的表格处理程序比如微软的Excel提供了执行数学运算的能力&#xff0c;比如计算格子中的值的和。表格处理程序示例无意挑战微软的市场地位&#xff0c;但是对于演示…...

es6中set和map的区别

在ES6&#xff08;ECMAScript 2015&#xff09;中&#xff0c;Set 和 Map 是两种新的集合类型&#xff0c;它们提供了更高级的数据结构来存储唯一值或键值对集合。尽管它们在功能上有些相似&#xff0c;但它们在用途和内部机制上存在一些关键区别。 1. 基本概念 Set&#xff1…...

高级实时通信:基于 Python 的 WebSocket 实现与异步推送解决方案

高级实时通信&#xff1a;基于 Python 的 WebSocket 实现与异步推送解决方案 目录 &#x1f7e2; WebSocket 协议概述&#x1f535; 在 FastAPI 中实现 WebSocket&#x1f7e3; Django Channels 实现异步实时通信&#x1f534; 使用 Redis 实现实时推送 &#x1f7e2; 1. WebS…...

大二上学期详细学习计划

本学习完成目标&#xff1a; 项目&#xff1a; 书籍&#xff1a;《mysql必知必会》《java核心技术卷》&#xff08;暂时&#xff09;加强JavaSE的学习&#xff0c;掌握Java核心Mysqlsql&#xff08;把牛客上的那50道sql语句题写完&#xff09;gitmaven完成springboot项目&…...

Kafka【十四】生产者发送消息时的消息分区策略

【1】分区策略 Kafka中Topic是对数据逻辑上的分类&#xff0c;而Partition才是数据真正存储的物理位置。所以在生产数据时&#xff0c;如果只是指定Topic的名称&#xff0c;其实Kafka是不知道将数据发送到哪一个Broker节点的。我们可以在构建数据传递Topic参数的同时&#xff…...

eNSP-Cloud(实现本地电脑与eNSP内设备之间通信)

说明&#xff1a; 想象一下&#xff0c;你正在用eNSP搭建一个虚拟的网络世界&#xff0c;里面有虚拟的路由器、交换机、电脑&#xff08;PC&#xff09;等等。这些设备都在你的电脑里面“运行”&#xff0c;它们之间可以互相通信&#xff0c;就像一个封闭的小王国。 但是&#…...

AI Agent与Agentic AI:原理、应用、挑战与未来展望

文章目录 一、引言二、AI Agent与Agentic AI的兴起2.1 技术契机与生态成熟2.2 Agent的定义与特征2.3 Agent的发展历程 三、AI Agent的核心技术栈解密3.1 感知模块代码示例&#xff1a;使用Python和OpenCV进行图像识别 3.2 认知与决策模块代码示例&#xff1a;使用OpenAI GPT-3进…...

QMC5883L的驱动

简介 本篇文章的代码已经上传到了github上面&#xff0c;开源代码 作为一个电子罗盘模块&#xff0c;我们可以通过I2C从中获取偏航角yaw&#xff0c;相对于六轴陀螺仪的yaw&#xff0c;qmc5883l几乎不会零飘并且成本较低。 参考资料 QMC5883L磁场传感器驱动 QMC5883L磁力计…...

基于Uniapp开发HarmonyOS 5.0旅游应用技术实践

一、技术选型背景 1.跨平台优势 Uniapp采用Vue.js框架&#xff0c;支持"一次开发&#xff0c;多端部署"&#xff0c;可同步生成HarmonyOS、iOS、Android等多平台应用。 2.鸿蒙特性融合 HarmonyOS 5.0的分布式能力与原子化服务&#xff0c;为旅游应用带来&#xf…...

Psychopy音频的使用

Psychopy音频的使用 本文主要解决以下问题&#xff1a; 指定音频引擎与设备&#xff1b;播放音频文件 本文所使用的环境&#xff1a; Python3.10 numpy2.2.6 psychopy2025.1.1 psychtoolbox3.0.19.14 一、音频配置 Psychopy文档链接为Sound - for audio playback — Psy…...

mysql已经安装,但是通过rpm -q 没有找mysql相关的已安装包

文章目录 现象&#xff1a;mysql已经安装&#xff0c;但是通过rpm -q 没有找mysql相关的已安装包遇到 rpm 命令找不到已经安装的 MySQL 包时&#xff0c;可能是因为以下几个原因&#xff1a;1.MySQL 不是通过 RPM 包安装的2.RPM 数据库损坏3.使用了不同的包名或路径4.使用其他包…...

Mysql中select查询语句的执行过程

目录 1、介绍 1.1、组件介绍 1.2、Sql执行顺序 2、执行流程 2.1. 连接与认证 2.2. 查询缓存 2.3. 语法解析&#xff08;Parser&#xff09; 2.4、执行sql 1. 预处理&#xff08;Preprocessor&#xff09; 2. 查询优化器&#xff08;Optimizer&#xff09; 3. 执行器…...

关于uniapp展示PDF的解决方案

在 UniApp 的 H5 环境中使用 pdf-vue3 组件可以实现完整的 PDF 预览功能。以下是详细实现步骤和注意事项&#xff1a; 一、安装依赖 安装 pdf-vue3 和 PDF.js 核心库&#xff1a; npm install pdf-vue3 pdfjs-dist二、基本使用示例 <template><view class"con…...

Kafka主题运维全指南:从基础配置到故障处理

#作者&#xff1a;张桐瑞 文章目录 主题日常管理1. 修改主题分区。2. 修改主题级别参数。3. 变更副本数。4. 修改主题限速。5.主题分区迁移。6. 常见主题错误处理常见错误1&#xff1a;主题删除失败。常见错误2&#xff1a;__consumer_offsets占用太多的磁盘。 主题日常管理 …...

Spring Security 认证流程——补充

一、认证流程概述 Spring Security 的认证流程基于 过滤器链&#xff08;Filter Chain&#xff09;&#xff0c;核心组件包括 UsernamePasswordAuthenticationFilter、AuthenticationManager、UserDetailsService 等。整个流程可分为以下步骤&#xff1a; 用户提交登录请求拦…...