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

news2024/11/17 23:28:45

目录

功能

步骤 

配置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*,最后设置给in
        in.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.coloradmin.cn/o/1479240.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

flutter学习(一) 安装以及配置环境

首先需要下载flutter&#xff0c;然后解压 然后配置环境变量&#xff0c;配置到bin目录就行 配置完之后cmd运行flutter doctor 你就会发现&#xff0c;都是错 此时脑海里响起&#xff0c;卧槽&#xff0c;怎么回事&#xff0c;咋办 别着急&#xff0c;我教你。。。 问题 这…

【QQ案例-QQ框架-主流框架 Objective-C语言】

一、接下来,我们来做一下这个QQ, 1.接下来,我们来做一下这个QQ, QQ框架啊, 这个东西呢,我们管它叫做“主流框架”, 首先呢,要告诉大家一点,这个东西呢,我们管它,叫做“主流框架”, 算是一个简称啊, 只能说,这种框架的类型,上边儿带navigation,下边儿带tabb…

Linux centos 变更MySQL数据存储路径

Linux centos 变更MySQL数据存储路径 登录mysql&#xff0c;查看数据存储路径创建新目录准备迁移数据检查是否配置成功 登录mysql&#xff0c;查看数据存储路径 mysql -u root -pshow global variables like "%datadir%";创建新目录 查看磁盘空间 df -h选取最大磁…

论文阅读:2015ResNet深度残差网络(待补充)

top5错误率&#xff1a;每张图片算法都会给出它认为最可能的五个类别&#xff0c;五个里面有一个是正确则算法预测正确。 技术爆炸1&#xff1a;2012年&#xff0c;DL和CNN用于CV&#xff1b;技术爆炸2&#xff1a;2015年&#xff0c;超过人类水平&#xff0c;网络可以更深&…

Unity-PDF分割器(iTextSharp)

PDF分割器 Unity-PDF分割器前言核心思路解决过程一、Unity安装iTextSharp二、运行时计算将要生成文件的大小三、分割核心代码四、使用StandaloneFileBrowser五、其他的一些脚本六、游戏界面主体的构建MainWindowWarningPanel & FinishPanel By-Round Moon Unity-PDF分割器 …

Vue3 在SCSS中使用v-bind

template 先创建一个通用的页面结构 <template><div class"v-bubble-bg"></div> </template>js 在JS中先对需要用的数据进行定义&#xff1a; 可以是参数&#xff0c;也可以是data <script setup>const props defineProps({bgCol…

Linux零基础快速入门

Linux的诞生 Linux创始人:林纳斯 托瓦兹 Linux 诞生于1991年&#xff0c;作者上大学期间 因为创始人在上大学期间经常需要浏览新闻和处理邮件&#xff0c;发现现有的操作系统不好用,于是他决心自己写一个保护模式下的操作系统&#xff0c;这就是Linux的原型&#xff0c;当时他…

【笔记】:更方便的将一个List中的数据传入另一个List中,避免多重循环

这里是 simpleInfoList 集合&#xff0c;记为集合A&#xff08;传值对象&#xff09; List<CourseSimpleInfoDTO> simpleInfoList courseClient.getSimpleInfoList(courseIds);if(simpleInfoListnull){throw new BizIllegalException("当前课程不存在!");}这…

[Flutter]TextButton自定义样式

在Flutter中&#xff0c;TextButton是一个简单的文本按钮&#xff0c;它遵循当前的Theme。如果你想要修改TextButton的样式&#xff0c;可以通过设置其style属性来实现&#xff0c;该属性接收一个ButtonStyle对象。 给TextButton和里面Text添加背景后&#xff0c;效果如下。可…

设计模式(二)单例模式

单例模式&#xff1a;确保一个类只有一个实例&#xff0c;并提供了全局访问点&#xff1b;主要是用于控制共享资源的访问&#xff1b; 单例模式的实现分为懒汉式和饿汉式。 懒汉式单例在需要时才会创建&#xff0c;而饿汉式单例则在类加载时立即创建实例&#xff1b; 单例模…

【精准获客,优化体验】Xinstall助力企业提升App渠道效果与用户满意度

在数字化时代&#xff0c;企业对于用户体验的重视程度日益提升。为了更好地满足用户需求&#xff0c;提供个性化、专属化的服务已经成为企业竞争的关键。今天&#xff0c;我们将向大家介绍一款名为Xinstall的一站式App全渠道统计服务商&#xff0c;它凭借强大的技术实力和丰富的…

【测试开发面试复习(一)】计算机网络:计算机网络体系结构(P1)补充ing

我每次复习的第一趴都是网络。。 一、高频面试题记录 1.1 计算机网络为什么要分层&#xff1f; 网络庞大而且复杂&#xff08;大量的软硬件系统、大量的程序和协议等&#xff09;&#xff0c;分层可提高整体结构的灵活性、将层次之间结构解耦&#xff0c;各层相互独立、隔离&…

轻松三步制作电子签名

一、在纸上签名&#xff0c;并且拍照。 二、新建空白word文档&#xff0c;使用WPS方式打开&#xff0c;再将图片复制进来。 三、点击图片&#xff0c;先选择【图片工具】中的【设置透明色】&#xff0c;然后点击签名之外的图片背景&#xff0c;即可制作为矢量图&#xff1b…

Redis 面试指南:常见问题及最佳答案

Redis 是一个高性能的键值存储系统&#xff0c;已经成为了许多企业和互联网公司的核心技术之一。本文将总结 Redis 面试中常见的问题&#xff0c;并提供最佳答案&#xff0c;以帮助读者更好地准备 Redis 面试。 引言&#xff1a; Redis 是一个开源、高性能、键值存储系统&…

朴素贝叶斯(带你从原理到实践)

目录 一、引言 二、朴素贝叶斯算法原理 1 贝叶斯定理 2 特征条件独立假设 3 分类过程 三、实践事例 四、朴素贝叶斯算法应用 1 文本分类 2 垃圾邮件过滤 3 情感分析 五、朴素贝叶斯算法未来发展 1 特征选择优化 2 半监督学习与无监督学习 3 结合深度学习 4 处理…

vue中动态引入图片

分析 很多时间&#xff0c;不管是vue2&#xff0c;还是vue3开发中都会遇到&#xff0c;动态渲染图片的功能&#xff0c;但是为什么我们直接将图片的路径直接赋值给变量的时候&#xff0c;图片渲染不出来&#xff0c;而通过require引入加载图片后却能正常渲染呢&#xff1f;主要…

数仓开发环境链接

这里写目录标题 1开发工具链接大数据组件1.1 启动hiveserver21.2配置DataGrip连接1.3测试使用 2 环境问题排查思路 1开发工具链接大数据组件 1.1 启动hiveserver2 数仓开发工具datagrip 需要用到JDBC协议链接到Hive&#xff0c;需要启动hiveserver2。 cd /opt/module/hive h…

PHP项目中composer和Git的组合使用

highlight: 在国内由于众所周知的原因&#xff0c;composer的package可能无法访问&#xff0c;解决办法是使用中国的全镜像&#xff1a; composer config -g repositories.packagist composer http://packagist.phpcomposer.com 在需要使用composer package的地方创建composer…

算法沉淀——动态规划之两个数组的 dp(上)(leetcode真题剖析)

算法沉淀——动态规划之两个数组的 dp 01.最长公共子序列02.不相交的线03.不同的子序列04.通配符匹配 01.最长公共子序列 题目链接&#xff1a;https://leetcode.cn/problems/longest-common-subsequence/ 给定两个字符串 text1 和 text2&#xff0c;返回这两个字符串的最长 …

ADS-B Ground Receiver Radarcape

目录 Radarcape ADS-B MLAT Receiver Web Browser User Interface Radarcape Technical Data Radarcape Software Features Radarcape Basics Radarcape ADS-B MLAT Receiver Radarcape is a professional ADS-B receiver made for 24/7 operation. High performance rec…