[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 和 QTextCharFormat
    QTextEdit::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;
        }
    }
}

  • 4
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值