qt学习:实战 记事本 + 快捷键 + 鼠标滚轮 + 打开读取写入关闭文件

目录

功能

步骤 

配置ui界面

添加图片资源

添加头文件和定义成员数据和成员函数

在构造函数里初始化

增加当前字体大小函数

减小当前字体大小函数

在用户按下 Ctrl 键的同时滚动鼠标滚轮时,执行放大或缩小操作

多选框变化后发出信号绑定槽函数来改变编码

编辑框的光标位置发生变化时发出信号绑定槽函数来改变对应有多少字符多少行

打开文件按钮的点击事件

保存文件按钮的点击事件

关闭文件按钮的点击事件


功能

  1. 支持文本创建,打开,保存,关闭的功能
  2. UI样式美化
  3. 添加打开快捷键,添加保存快捷
  4. 底部显示行列号及文本字符编码
  5. Ctrl加鼠标滚轮支持字体放大缩小

步骤 

配置ui界面

三个按钮,一个编辑框,一个下拉菜单,一个标签

添加图片资源

自己找图片加进资源就可以了

点击项目右键-----选择add new...------左边选择QT---------中间选QT Resource file-----点击确认--------填写资源文件名-------点击下一步----------再点击下一步----------在下面前缀一栏改成自己要的前缀-------点击add files选择图片确认-------在左边项目栏就可以看到图片资源了

添加头文件和定义成员数据和成员函数

在.h里

#include <QFileDialog>
#include <QDebug>
#include <QMessageBox>
#include <QShortcut>
#include <QWheelEvent>
#include <QFile>public:QFile file;//文件描述符void zoomIn();//增加当前字体大小函数void zoomOut();//减小当前字体大小函数bool eventFilter(QObject *watched, QEvent *event);//在用户按下 Ctrl 键的同时滚动鼠标滚轮时,执行放大或缩小操作//槽函数
private slots:void onCurrentIndexChanged(int index);//多选框变化后发出信号绑定槽函数来改变编码void onCursorPositionChanged();//编辑框的光标位置发生变化时发出信号绑定槽函数来改变对应有多少字符多少行

在构造函数里初始化

// 创建一个快捷键  并关联到该窗口
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);//关联对应的函数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()));

增加当前字体大小函数

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);
}

在用户按下 Ctrl 键的同时滚动鼠标滚轮时,执行放大或缩小操作

bool Widget::eventFilter(QObject *watched, QEvent *event)
{/* 如果按下了 Ctrl 键,它会在调试输出中打印 "Ctrl"QKeyEvent *keyEvent = (QKeyEvent*)event;if(keyEvent->key() == Qt::Key_Control){qDebug() << "Ctrl";}*///检查事件类型是否是鼠标滚轮事件if(event->type() == QEvent::Wheel){//QGuiApplication::keyboardModifiers()函数返回当前被按下的所有键盘修饰键(如 Shift、Ctrl、Alt 等)//检查当前是否有控制键(Ctrl)被按下if(QGuiApplication::keyboardModifiers() == Qt::ControlModifier){//使用 dynamic_cast 将 QEvent 基类对象转换为 QWheelEvent 鼠标滚轮类对象QWheelEvent *wheelEvent = dynamic_cast<QWheelEvent*>(event);//判断是向上滚轮还是向下滚轮,放大字体还是缩小字体if(wheelEvent->angleDelta().y() > 0){zoomIn();}else if(wheelEvent->angleDelta().y()<0){zoomOut();}return true;}return false;}
}


多选框变化后发出信号绑定槽函数来改变编码

void Widget::onCurrentIndexChanged(int index)
{qDebug() << "currentItSignal";//清除了textEdit文本框中的所有内容ui->textEdit->clear();//检查file是否处于打开状态if(file.isOpen()){qDebug() << "file is Open";//可以使用in来读取文件的内容QTextStream in(&file);//设置了QTextStream对象in的编码方式//首先将comboBox的当前文本转换为std::string,然后转换为const char*,最后设置给inin.setCodec(ui->comboBox->currentText().toStdString().c_str());//将文件的位置指示器移动到文件的开头file.seek(0);//持续执行,直到in到达文件的末尾while(!in.atEnd()){//用in的readLine方法读取文件的一行,并将其存储在context这个QString变量中QString context = in.readLine();//读取到的context字符串追加到textEdit文本框的末尾ui->textEdit->append(context);}}
}


编辑框的光标位置发生变化时发出信号绑定槽函数来改变对应有多少字符多少行

void Widget::onCursorPositionChanged()
{//获取当前光标位置  并将其存储在 cursor 变量中QTextCursor cursor =  ui->textEdit->textCursor();//cursor.blockNumber() 返回光标所在块的索引(通常是行号)//cursor.columnNumber() 返回光标在行内的位置(列号)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;//1. 设置当前cursor行为高亮ext.cursor = cursor;//用于填充cursor行显示高亮的背景  设置高亮的颜色为浅灰色QBrush qBrush(Qt::lightGray);//2. 显示高亮的背景ext.format.setBackground(qBrush);//配置段属性:整行显示,没有这句话不行//确保整行都被高亮显示,而不仅仅是光标所在的位置ext.format.setProperty(QTextFormat::FullWidthSelection, true);//ext.format.setFontUnderline(true);//设置下划线//3. 设置//将配置好的 `ext` 添加到 `extraSelections` 列表中extraSelections.append(ext);//将这个列表应用到 `QTextEdit` 上,从而高亮显示当前行ui->textEdit->setExtraSelections(extraSelections);
}

打开文件按钮的点击事件

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::ReadWrite | QIODevice::Text)){qDebug() << "file open error";}//设置该界面的标题this->setWindowTitle(fileName + "- MyNoteBook");//准备读取文件内容QTextStream in(&file);//获取多选框里的文本编码QString str = ui->comboBox->currentText();//把QString转化成char *const char* c_str = str.toStdString().c_str();//设置文本编码in.setCodec(c_str);//不断一行一行的读出文件内容然后显示while(!in.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:/QT/untitled.txt",tr("Text (*.txt *.doc)"));//将`file`对象的文件名设置为用户通过文件对话框选择的文件名file.setFileName(fileName);//尝试以只写模式和文本模式打开文件。如果打开失败,使用qDebug()输出错误信息。if(!file.open(QIODevice::WriteOnly | QIODevice::Text)){qDebug() << "file open error";}//设置当前窗口的标题this->setWindowTitle(fileName + "- MyNoteBook");}//创建一个QTextStream对象out,用于向file对象写入文本QTextStream out(&file);//设置out对象的编码方式out.setCodec(ui->comboBox->currentText().toStdString().c_str());//获取编辑框的文本QString context = ui->textEdit->toPlainText();//写入到文件里out << context;
}

关闭文件按钮的点击事件

void Widget::on_btnClose_clicked()
{//创建了一个`QMessageBox`对象,用于显示一个消息框QMessageBox msgBox;//显示一个警告消息框//消息框提供了三个按钮:保存(Save)、不保存(Discard)和取消(Cancel)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_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;}
}

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

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

相关文章

鸿蒙ArkTs开发问题总结

版本问题 现阶段鸿蒙ArkTs开发主要分为两个版本 HarmonyOS3.x.x(API9)及HarmonyOS4.x.x(API10) 一下简称为 API9,API10 官方现在所有案例均以 HarmonyOS4.x.x(API10) 为基础请注意选择分支 API9&HarmonyOS3.x.x 鸿蒙开发编译器默认下载的为public版本SDK不是全量SDK需要…

高光谱遥感学习入门丨高光谱数据处理基础、Python和Matlab高光谱遥感数据处理

目录 ①Python高光谱遥感数据处理与高光谱遥感机器学习方法深度应用 ②Matlab高光谱遥感、数据处理与混合像元分解实践技术应用 ③高光谱遥感数值建模技术及在植被、水体、土壤信息提取领域应用 更多应用 高光谱遥感信息对于我们认识世界具有重要意义。尽管大部分物质在人眼…

Google Genie:创意互动环境

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗&#xff1f;订阅我们的简报&#xff0c;深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同&#xff0c;从行业内部的深度分析和实用指南中受益。不要错过这个机会&#xff0c;成为AI领…

经典DP-最长单调子序列

最长递增子序列 思路 定义状态&#xff1a; 我们定义一个数组 dp&#xff0c;其中 dp[i] 表示以 nums[i] 结尾的最长递增子序列的长度。初始化状态&#xff1a; 对于数组中的每个元素 nums[i]&#xff0c;初始时都可以被视为一个长度为1的递增子序列&#xff0c;因此 dp[i] 的…

2.29IO进程线程

编写链表&#xff0c;链表里面随便搞点数据 使用 fprintf 将链表中所有的数据&#xff0c;保存到文件中 使用 fscanf 读取文件中的数据&#xff0c;写入链表中 #include <stdio.h> #include <string.h> #include <unistd.h> #include <stdlib.h>typed…

“集世界精华·展中国风采”2024北京智能科技展会(世亚智博会)

在科技的浪潮中&#xff0c;中国犹如一艘乘风破浪的巨轮&#xff0c;稳健地航行在广阔的海洋上。随着科技的飞速发展&#xff0c;中国正逐渐成为全球科技领域的一面旗帜&#xff0c;引领着世界科技潮流。在这个伟大的时代&#xff0c;中国以卓越的科技创新能力和前瞻的战略视野…

vue-electron 项目创建记录及注意事项

vue-electron 项目创建记录及注意事项 1、使用vue ui或者命令行创建vue项目 2、添加electron插件 3、安装element-plus: npm install --save element-plus 4、修改配置文件如下图: vue.config.js增加配置&#xff1a; pluginOptions:{ electronOutput: { contextIsolation…

WiFi模块引领智能家居革命:连接未来的生活

随着科技的快速发展&#xff0c;智能家居正成为现代生活的一部分&#xff0c;极大地改变了我们与家庭环境互动的方式。其中&#xff0c;WiFi模块作为关键的连接技术&#xff0c;在推动智能家居革命中发挥着不可忽视的作用。本文将深入探讨WiFi模块如何驱动智能家居革命。 设备互…

Linux——haproxy搭建Web群集

一、haproxy概述 HAProxy 提供高可用性、负载均衡以及基于TCP和HTTP的应用代理&#xff0c;支持虚拟主机&#xff0c;它是免费、快速并且可靠的一种负载均衡解决方案。适合处理高负载站点的七层数据请求。类似的代理服务可以屏蔽内部真实服务器&#xff0c;防止内部服务器遭受攻…

TVM 和模型优化的概述(1)

文章目录 1. 从 Tensorflow、PyTorch 或 Onnx 等框架导入模型&#xff08;model&#xff09;。2.翻译成 Relay3. lower 到 张量表达式。4. 使用 auto-tuning 模块 AutoTVM 或 AutoScheduler 搜索最佳 schedule。5. 选择最佳配置进行模型编译。6. lower 到 TIR。7. 编译成机器码…

QML中动态增加表格数据

1.QML中的表格实现 import QtQuick 2.15 import QtQuick.Window 2.15import QtQuick.Controls 2.0 import Qt.labs.qmlmodels 1.0 import QtQuick.Layouts 1.15Window {width: 640height: 480visible: truetitle: qsTr("Hello World")TableModel{id:table_modelTabl…

Stable Diffusion 模型分享:Henmix_Real(人像、真实、写真、亚洲面孔)

本文收录于《AI绘画从入门到精通》专栏&#xff0c;专栏总目录&#xff1a;点这里。 文章目录 模型介绍生成案例案例一案例二案例三案例四案例五案例六案例七案例八 下载地址 模型介绍 作者述&#xff1a;这个模型试图改变&#xff0c;以便西方人和亚洲人都能够表达得很好。此…