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*,最后设置给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;
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

码农小白

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值