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

这篇具有很好参考价值的文章主要介绍了qt学习:实战 记事本 + 快捷键 + 鼠标滚轮 + 打开读取写入关闭文件。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

目录

功能

步骤 

配置ui界面

添加图片资源

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

在构造函数里初始化

增加当前字体大小函数

减小当前字体大小函数

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

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

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

打开文件按钮的点击事件

保存文件按钮的点击事件

关闭文件按钮的点击事件


功能

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

步骤 

配置ui界面

shortcut = new qshortcut(qkeysequence(tr(

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

添加图片资源

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

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

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

在.h里文章来源地址https://www.toymoban.com/news/detail-847512.html

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

到了这里,关于qt学习:实战 记事本 + 快捷键 + 鼠标滚轮 + 打开读取写入关闭文件的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包赞助服务器费用

相关文章

  • Java小程序-记事本

    Java小程序-记事本

    摘 要 为了使自己熟悉Java编译,了解更多的面向对象语言的编程策略。进而,深入了解Java语言的操作、及原理等。因此我开发了一个记事本,使自己可以巩固知识,加深记忆。设计一个简易记事本,能够记录使用者输入的信息,同时可以实现保存输入的信息,以方便后期查看

    2024年02月04日
    浏览(11)
  • 11 MFC 制作记事本

    11 MFC 制作记事本

    选择Menu 点击新建 将内容写入\\\"_\\\"的用 符号 将菜单加入到窗口中 右键选择添加事件处理程序 点击确定 Edit设置多行显示 Edit设置按回车能够换行 Edit设置竖直方向滚动 打开文件代码 查找与替换对话框显示(非模态对话框) 对话框消息与对话框处理函数 对话框处理函数 //note

    2024年02月11日
    浏览(11)
  • vue记事本渲染以及交互

    2024年04月10日
    浏览(17)
  • 简单的手机记事本哪个好用?

    简单的手机记事本哪个好用?

    在快节奏的现代生活中,我们经常需要记录下来重要的信息,而手机记事本成为了不可或缺的工具。然而,市面上琳琅满目的手机记事本软件,让人眼花缭乱,不知道该选择哪一个。 敬业签是功能强大、操作简单的手机记事本,它可以让你快速记录下重要的信息,同时还支持

    2024年02月11日
    浏览(15)
  • Android开发_记事本(1)

    Android开发_记事本(1)

    TextView中有下述几个属性: id: 为TextView设置一个组件id,根据id,我们可以在Java代码中通过findViewById()的方法获取到该对象,然后进行相关属性的设置,又或者使用RelativeLayout时,参考组件用的也是id! layout_width: 组件的宽度,一般写: wrap_content 或者 match_parent(fill_parent) ,前

    2023年04月10日
    浏览(19)
  • Android Studio——记事本案例

    Android Studio——记事本案例

    一、布局界面         1、记事本界面布局 main_notepad.xml         2、记事本Item布局界面 activity_item.xml         3、添加、修改界面布局 activity_record.xml 二、封装记录信息实体类         记事本的每个记录都会有记录内容和记录时间这两个属性,因此需要建立一个实体类用于存

    2024年02月05日
    浏览(21)
  • Windows应用程序——记事本

    Windows应用程序——记事本

    本博客介绍如何使用Visual Studio 2019设计一个Windows应用程序——记事本,通过学习,可以进一步掌握MenuStrip(菜单)、ToolStrip(工具栏)、RichTextBox(高级文本框)和StatusStrip(状态栏控件)等控件的使用,以及如何使用CommonDialog(公共对话框)实现对文本的存取、格式设置等

    2024年02月03日
    浏览(11)
  • java记事本源代码

    java记事本源代码

    本文仿电脑自带记事本,实现的功能有新建、新窗口、打开、保存、另存为、退出、撤销、剪切、复制、粘贴、删除、查找、查找下一个、查找上一个、替换、转到、全选、时间/日期、自动换行、缩放(放大、缩小、恢复默认大小),未实现功能有页面设置、打印、字体、状

    2024年02月10日
    浏览(12)
  • 【Java】实现记事本(完整版)

    【Java】实现记事本(完整版)

    💕💕💕大家好,这是作业侠系列之Java实现记事本,还是那句话,我的粉丝们需要源码直接qq邮箱+你需要的源码私发我即可哦,大家觉得还行的话,期待你们的三连,这也是我创作的最大动力💕💕💕 往期源码回顾: 【Java】实现绘图板(完整版) 【C++】图书管理系统(完整板

    2024年02月08日
    浏览(15)
  • C# 记事本应用程序

    2024年02月10日
    浏览(14)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包